【数据结构与算法】十大经典排序算法-插入排序

这篇具有很好参考价值的文章主要介绍了【数据结构与算法】十大经典排序算法-插入排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🌟个人博客:www.hellocode.top
🏰Java知识导航:Java-Navigate
🔥CSDN:HelloCode.
🌞知乎:HelloCode
🌴掘金:HelloCode
⚡如有问题,欢迎指正,一起学习~~


插入排序(Insertion Sort)是一种简单直观的排序算法,其基本思想是将一个记录插入到已排好序的有序序列中,直到所有记录插入完成为止。

基本思想

【数据结构与算法】十大经典排序算法-插入排序,数据结构与算法,排序算法,算法,java

如上图所示,插入排序的基本思想就是将一个数组划分为两部分:有序部分和无序部分。通过将无序部分的元素依次插入有序部分(需要找到对应的正确位置),让每次插入的每个元素都能在正确的位置,保证有序部分始终有序,在将无序部分的元素全部插入到有序部分后,整个集合也就为有序的了。

  1. 从第二个元素开始,依次将当前元素插入到已排好序的有序序列中,直到最后一个元素。
  2. 插入当前元素时,从后往前遍历已排好序的有序序列,找到当前元素在有序序列中的位置,并将其插入到该位置。
  3. 重复执行步骤2,直到所有元素都插入完毕。

举个例子,比如我们有一组数字 [5, 3, 8, 4, 2],我们可以首先把第一个数字5视为已排序序列,然后从第二个数字3开始,与已排序序列中的元素逐一比较,找到合适的位置插入。然后针对第三个数字8,我们再重复这个过程,直至所有的数字都插入到已排序序列中。

代码实现

具体的代码就是两层for循环,外层控制未排序部分的指针,内层不断循环寻找新插入元素的正确位置,代码如下:

/**
 * @author HelloCode
 * @blog https://www.hellocode.top
 * @date 2023年08月09日 21:45
 */
public class InsertSort {

    public static void main(String[] args) {
        int[] arr = {21, 64, 32, 11, 9, 5, 3, 41, 75, 32, 12, 98, 66};
        System.out.println("排序前:" + Arrays.toString(arr));
        insertSort(arr);
        System.out.println("排序后:" + Arrays.toString(arr));
    }

    public static void insertSort(int[] arr) {
        // 外层循环,i指向数组中未排序的元素,也可以表示已经有序元素的个数
        for (int i = 1; i < arr.length; i++) {
            // 内层for指向已经排好序的最后一个元素
            for (int j = i - 1; j >= 0; j--) {
                // 开始排序,寻找新加入的元素的正确位置,(j + 1)代表新加入的元素
                if (arr[j + 1] >= arr[j]) {
                    // 代表不用交换,加入即有序,直接跳出循环
                    break;
                }
                // 否则需要进行交换,直到找到合适位置
                int temp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

测试:

【数据结构与算法】十大经典排序算法-插入排序,数据结构与算法,排序算法,算法,java

优化

对于插入排序,能够优化的点我认为是在为新插入元素寻找正确位置的时候,上面的代码采用的是依次比较,类似于冒泡排序的思想。如果数据量大且情况最差的时候,效率就有些不理想了,因此可以用其他方法在此处进行优化,提升插入排序的性能

二分查找:在每次需要插入元素时,使用二分查找来找到插入的位置,而不是从头到尾扫描已排序序列。这样可以将比较次数降低为O(log n)。

具体代码这里就不列了,后面可能会有专门的二分查找文章。文章来源地址https://www.toymoban.com/news/detail-636391.html

总结

优点

  1. 实现简单,对于部分有序的数组效率高。
  2. 对于小规模数据或者部分有序的数据,插入排序的运行时间相对较短。

缺点

  1. 对于大规模数据或者随机数据,插入排序的时间复杂度较高,为O(n^2)。
  2. 是非稳定的排序算法,即相等的元素可能会因为排序而变得顺序颠倒。

复杂度

  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)

使用场景

  1. 小型数据集:对于小型的数据集,插入排序是一种高效且简单的排序算法
  2. 部分排序的数据集:如果一个数据集大部分是排序的,那么插入排序将是一个很好的选择。例如,考虑一个场景,一个团队在一场比赛中获得了一组分数,这些分数按照高低已经被排序,但是有一个新的分数需要插入到合适的位置。在这种情况下,插入排序可以快速找到新分数的位置并把它插入到正确的位置。
  3. 外部排序:当处理非常大的数据集时,可能需要使用外部排序。外部排序是指那些不能一次性加载到内存中的数据的排序。在这种情况下,可以使用插入排序作为子程序,从外部存储器中读取元素并将它们插入到已经排序的部分中。
  4. 与其他算法结合:插入排序也可以与其他算法结合使用。例如,当需要先对数据进行排序,然后再进行一些复杂的操作时,可以使用插入排序作为预处理步骤。

到了这里,关于【数据结构与算法】十大经典排序算法-插入排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《数据结构与算法》之十大基础排序算法

    冒泡排序是一种交换排序,它的思路就是在待排序的数据中,两两比较相邻元素的大小,看是否满足大小顺序的要求,如果满足则不动,如果不满足则让它们互换。 然后继续与下一个相邻元素的比较,一直到一次遍历完成。一次遍历的过程就被成为一次冒泡,一次冒泡的结束

    2024年02月05日
    浏览(82)
  • 算法 数据结构 递归插入排序 java插入排序 递归求解插入排序算法 如何用递归写插入排序 插入排序动图 插入排序优化 数据结构(十)

    1. 插入排序(insertion-sort):                                           是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入     算法稳定性:                  

    2024年02月09日
    浏览(38)
  • 数据结构算法-插入排序

    一、概念及其介绍 插入排序(InsertionSort),一般也被称为直接插入排序。 对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增 1 的有序表 。在其实现过程使用双层

    2024年02月21日
    浏览(33)
  • 数据结构与算法—插入排序&选择排序

    目录 一、排序的概念 二、插入排序   1、直接插入排序  特性总结: 2、希尔排序 特性总结:  三、选择排序 1、直接选择排序  特性总结: 2、堆排序—排升序(建大堆) 向下调整函数 堆排序函数 特性总结: 代码完整版:   头文件  函数文件  测试文件 排序 :所谓排序,

    2024年01月20日
    浏览(37)
  • 数据结构算法练习 插入排序 冒泡排序

    插入排序 代码如下  package main import \\\"fmt\\\" func main() {     a := []int{4, 5, 6, 1, 3, 2}         b := insert(a)     for i := 0; i len(b); i++ {         fmt.Println(b[i])     } } func insert(a []int) []int {     if len(a) = 1 {                   如果数组长度小于等于1 不用排序直接返回          retur

    2024年02月08日
    浏览(26)
  • 数据结构与算法:插入排序&希尔排序

    假设现在你有一个有序的数组,你要把一个数据插入到数组中,保证插入后依然有序,要怎么做? 对于人来说,这个问题就像是在整理扑克牌,瞄一眼就知道应该插入什么位置。但是对于程序来说,就需要一一对比,直到找到一个位置 左边比它大,右边比它小 ,就算找到了

    2024年01月17日
    浏览(45)
  • 【数据结构】常见排序算法——常见排序介绍、插入排序、直接插入排序、希尔排序

      在计算机科学中,排序是将一组数据按照指定的顺序排列的过程。排序算法由于执行效率的不同可以分为多种不同的算法。   通常情况下,排序算法可以分为两类,即 内部排序和外部排序 。内部排序是指数据全部加载到内存中进行排序,适用于数据量较小的情况,而

    2024年02月08日
    浏览(39)
  • 数据结构算法--2 冒泡排序,选择排序,插入排序

    思想就是将相邻元素两两比较,当一个元素大于右侧相邻元素时,交换他们的位置,小于右侧元素时,位置不变,最终序列中的最大元素,像气泡一样,到了最右侧。 这时冒泡排序第一轮结束,数列最右侧元素9的位置可认为是一个有序区,有序区目前有一个元素. 第二轮排序

    2024年02月13日
    浏览(32)
  • 【数据结构与算法】排序算法(选择排序,冒泡排序,插入排序,希尔排序)

    基本概念这了就不浪费时间解释了,这四种都是很简单的排序方式,本专栏后续文章会出归并排序,计数排序,快速排序,堆排序,桶排序等排序算法,今天这篇文章中给出选择排序,冒泡排序,插入排序和希尔排序的实现; 如果发现文章中有错误,还请大家指出来,我会非

    2024年02月15日
    浏览(45)
  • 【数据结构与算法】插入排序和希尔排序

      目录 一.插入排序  InsertSort 基本思想 动图演示  特性总结 二.希尔排序  ShellSort 基本思想 图例 特性总结 基本思想 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。 当插入第i(i=1)个元素

    2023年04月18日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包