墨风如雪博客

  • 源码小店
  • 导航站
  • 登录
  • java
  • 资源分享
让AI使用变得如此简单
  1. 首页
  2. 算法
  3. 正文

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

2023年 7月 24日 89点热度 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日

墨风如雪

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

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

文章评论

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

墨风如雪

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

最新 热点 随机
最新 热点 随机
小红书AI新里程碑:dots.llm1,中文MoE的“人文”突破! 告别机械感!OpenAudio S1让AI声音活起来 Sora触手可及!微软必应AI视频生成器,全民创作时代来临? 阿里WebAgent开源:引领自主搜索新纪元 重磅炸弹!字节跳动开源BAGEL:70亿参数,统一多模态理解与生成,AI“全能王”诞生记! 小米MiMo-VL:7B参数,怎么就成了多模态界的“越级打怪王”?
AI圈炸锅了!Mistral Medium 3:性能 SOTA,成本打骨折,企业玩家的新宠?字节终于开源“扣子”同款引擎了!FlowGram:AI 时代的可视化工作流利器告别“微信黑箱”!Chatlog:让你的聊天记录也能拥有“AI大脑”!字节跳动 Seed-Coder-8B:不靠人工洗数据,这80亿参数的小模型如何写出顶尖代码?85倍速的视觉革命:苹果发布 FastVLM,让你的 iPhone ‘看图说话’,快到飞起!告别AI视频“变脸怪”!腾讯混元Hunyuan Custom重磅开源,主体一致性“王炸”来了!
DeepSite 深度解析:零门槛 AI 编程神器,免费打造你的专属应用与游戏 Java Authentication and Authorization Service(JAAS)安全框架 破壁者:DeepSeek EP如何打通AI大模型的效率革命 NGINX配置文件详解 Nginx文件配置 使用和简单部署(超详细) 炸裂!OpenAI 不声不响发布 GPT-4.1 全家桶,开发者狂喜:更快、更强、还更便宜?
标签聚合
AI deepseek spring java 设计模式 算法 教程 动态规划

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

Theme Kratos Made By Seaton Jiang

免责声明 - 隐私政策