墨风如雪博客

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

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

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

墨风如雪

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

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

文章评论

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

墨风如雪

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

最新 热点 随机
最新 热点 随机
降维打击!Mistral Voxtral:开源语音的“终结者”已上线! AI“游侠”降临A股:16个“大脑”组团“炒股”,30秒“算命”市场! 视频魔法来了!AI能实时“变脸”直播,连游戏画面也能瞬间换装? 告别“听指令”,AI要“自己动手”了!ChatGPT Agent,AI界的“全能选手”已上线! 8B 模型吊打 671B?数学证明界“卷王”Goedel-Prover-V2 来了! Kiro来了!亚马逊放大招,软件开发要被AI“绑架”了吗?
昆仑万维扔出王炸:32B模型干翻671B,代码界迎来全能修理工!8亿参数撬动实时混音!谷歌开源“口袋DJ”,人人都能玩转音乐告别插件时代!OmniGen2:一个模型,通吃所有AIGC神操作2000万次呼唤背后,蓝骑士有了“赛博外挂”智能触手可及:Google Gemma-3n 系列模型,让万物皆能“思考”AI圈大地震!120亿参数的FLUX编辑器开源,你的显卡准备好了吗?
nginx配置反向代理教程 Telegram不再安全?从警博会看中国对加密通讯的AI化监控与你的隐私防线 SpringMVC | SpringMVC 入门 SpringMVC 核心组件 DispatcherServlet详解 解锁 AI 生产力:Prompt-Optimizer 如何成为你的提示词神器 一张3090就能跑!腾讯混元A13B,这是给AI圈的降维打击?
标签聚合
spring 大模型 java deepseek AI 设计模式 教程 算法

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

Theme Kratos Made By Seaton Jiang

免责声明 - 隐私政策