墨风如雪博客

  • 源码小店
  • 传家宝VPS
让AI使用变得如此简单
  1. 首页
  2. 算法
  3. 正文

每日一道算法题:插入排序算法

2023年 7月 24日 299点热度 0人点赞 0条评论

插入排序算法的介绍

插入排序算法是一种简单而常见的排序算法,通常用于对小型数据集进行排序操作。插入排序算法与选择排序算法有些相似,但其实现方式和复杂度略有不同。

本文将介绍插入排序算法的基本思想、链表插入排序的简介、算法流程、时间复杂度分析、实例演示、优化等内容,希望能对读者理解插入排序算法以及其在实际应用中的用途有所帮助。

插入排序的基本思想

插入排序算法的基本思想非常简单:将一个待排序的元素插入到已经排好序的子序列中,使之成为一个更长的有序序列。

插入排序算法的实现方式类似于扑克牌的排序,即从一堆无序的扑克牌中,逐张将它们排序,使它们形成有序的扑克牌序列。在插入排序算法中,我们将无序的元素看成是还没有排好序的扑克牌,而已经排好序的子序列则相当于已经排好序的扑克牌。

插入排序算法的过程,可以简单地总结为:

  1. 从待排序序列中选择一个元素,将其插入到已经排好序的子序列中。

  2. 重复执行步骤1,直到整个序列都排好序为止。

链表插入排序的简介

针对插入排序算法在数组排序方面的一些不足,链表插入排序算法应运而生。链表插入排序算法不需要开辟额外的空间,只需要将链表节点进行移动,就能完成排序操作。同时,链表插入排序算法对于数据量巨大的情况下更为适用。

链表插入排序算法的实现方式类似于插入排序算法,将一个待排序的元素插入到已经排好序的子序列中,使之形成一个有序的序列。因为链表具有指针指向前驱和后继节点的特性,所以针对链表的插入排序算法与数组的实现方式有所不同。

算法流程

为了更好地描述如何实现链表插入排序算法,接下来将详细介绍其具体的算法流程。

初始化排序链表

首先,需要创建一个新的链表,然后将原始的链表中的第一个元素插入到排序链表中。通过这一步操作,我们就建立了一个已经排好序的子序列。

遍历原始链表

然后,我们需要遍历原始链表中的每一个元素,以找到合适的位置将其插入到排序链表中。在插入之前,需要先找到排序链表中应该插入的位置。如果插入的元素比已经排好序的链表中的某些元素更小,则需要一直向前探索,直到找到正确的插入位置。

找到排序链表中合适的插入位置

为了找到排序链表中的正确插入位置,我们需要将当前元素与排序链表中的每一个元素进行比较。如果当前元素比排好序的链表中的某个元素更小,则需要继续向前探索,直到找到正确的插入位置为止。

将元素插入排序链表中

找到了正确的插入位置之后,我们就可以将当前元素插入到排序链表中,此时排序链表的长度加一。

重复以上三个步骤,直到原始链表中的所有元素都被插入到排序链表中。

时间复杂度分析

在最坏的情况下,链表插入排序算法的时间复杂度是 O(n^2)。这是因为每次查找新节点的正确插入位置时,我们都需要从链表的开头开始搜索,这导致了算法效率的低下。但是,在某些情况下,链表插入排序算法的效率可能会达到 O(n)。

实例演示

以下是基于链表插入排序算法的Java实现代码示例:

public class LinkedListSorter {

    // 将链表按升序进行排序
    public static LinkedListNode sort(LinkedListNode head) {
        // 初始化排序链表
        LinkedListNode sortedHead = new LinkedListNode(head.value);
        head = head.next;

        while (head != null) {
            LinkedListNode current = head;
            head = head.next;

            // 找到当前节点在排序链表中合适的插入位置
            if (current.value < sortedHead.value) {
                current.next = sortedHead;
                sortedHead = current;
            } else {
                LinkedListNode search = sortedHead;
                while (search.next != null && current.value > search.next.value) {
                    search = search.next;
                }
                current.next = search.next;
                search.next = current;
            }
        }

        return sortedHead;
    }

    public static void main(String[] args) {
        LinkedListNode head = new LinkedListNode(10);
        head.next = new LinkedListNode(4);
        head.next.next = new LinkedListNode(20);
        head.next.next.next = new LinkedListNode(15);
        head.next.next.next.next = new LinkedListNode(35);

        LinkedListNode sortedHead = sort(head);

        while (sortedHead != null) {
            System.out.print(sortedHead.value + " ");
            sortedHead = sortedHead.next;
        }
    }
}

输出结果为:

4 10 15 20 35

优化

为了提高链表插入排序算法的效率,我们可以使用以下两种优化方式。

插入排序过程中避免搜索

当新节点被插入到排序链表的某个位置时,需要首先遍历整个排序链表,以找到其正确的插入位置。但是,我们可以在遍历排序链表的过程中保存一些节点,以便将新节点插入到它们之间。这种优化方式可以避免对排序链表的重复搜索,从而提高算法效率。

双向链表插入排序

使用双向链表实现插入排序算法可以更快地查找当前节点在排序链表中的正确插入位置。这是因为双向链表中的每个节点都有一个指向前驱节点的指针,从而使得在查找插入位置时只需要从当前节点和它的前驱节点开始搜索。

总结

插入排序算法是一种简单而常见的排序算法,通常用于对小型数据集进行排序操作。链表插入排序算法是基于插入排序算法的一种改进方式,针对数组插入排序算法的一些不足做了优化。

链表插入排序算法的时间复杂度通常是 O(n^2),但在某些情况下可能会达到 O(n)。我们可以使用一些优化方式来提高链表插入排序算法的效率,例如插入排序过程中避免搜索和使用双向链表。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: java 动态规划 插入排序 数组 算法
最后更新:2023年 6月 23日

墨风如雪

一个热爱生活,热爱分享的程序员

打赏 点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

墨风如雪

一个热爱生活,热爱分享的程序员

最新 热点 随机
最新 热点 随机
1美元雇佣顶级架构师?MiniMax M2.5要把Agent价格打穿 那个霸榜的Pony Alpha现身了:智谱GLM-5硬刚Claude Opus 纯国产算力硬刚GPT?聊聊刚发布的讯飞星火X2 阿里Qwen-Image-2.0实测:终于有一款能听懂人话、写对汉字的AI了 别再等Sora了,字节Seedance 2.0才是AI视频的“导演时刻” Mistral 掀桌子:40亿参数跑本地,Voxtral 2 把延迟压进了200毫秒
1美元雇佣顶级架构师?MiniMax M2.5要把Agent价格打穿
小米亮剑:快20倍的「顺风耳」,让人车家听懂全世界 你的笔记本也能跑“AI大神”!微软Phi-4-mini-flash-reasoning震撼登场 告别代码苦海:Manus 1.5 让你的创意以光速落地 谷歌掀桌子:Gemini Deep Research 让深度思考进入白菜价时代 每日一题|剑指Offer地狱级难题!正则表达式匹配,你能扛住吗? docker 网络模式的使用详解
标签聚合
java AI 大模型 spring 算法 开源 设计模式 教程

COPYRIGHT © 2023 墨风如雪博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang