插入类排序-直接插入排序

222 阅读2分钟

排序算法中可以大致分为以下几类

  1. 插入类排序:直接插入排序、折半插入排序、希尔排序
  2. 选择类排序:简单选择排序、堆排序
  3. 交换类排序:冒泡排序、快速排序

本文介绍插入排序序(InsertionSort)的基本实现思路,插入排序也称为直接插入排序。适用于数据量下的排序。

实现方式

1.从数组的第二个数据开始往前比较,即一开始用第二个数和他前面的一个比较,如果 符合条件(比前面的大或者小,自定义),则让他们交换位置。

2.然后再用第三个数和第二个比较,符合则交换,但是此处还得继续往前比较,比如有 5个数8,15,20,45, 17,17比45小,需要交换,但是17也比20小,也要交换,当不需 要和15交换以后,说明也不需要和15前面的数据比较了,肯定不需要交换,因为前 面的数据都是有序的。

3.重复步骤2,一直到数据全都排完。

js代码实现

    let arr = [8,15,20,45, 17]
    for(let i=0 ; i<arr.length ; i++){
        let item = arr[i]
        let j=i-1
        while(j>=0;item<arr[j]){
          arr[j+1] = arr[j]
          j--
        }
        arr[j+1]=item
        console.log(arr)
    }

输出结果:

image.png

插入排序的复杂度分析

插入排序的平均时间复杂度也是 O(n^2),空间复杂度为常数阶 O(1),具体时间复杂度和数组的有序性也是有关联的。

插入排序中,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较 N-1 次,时间复杂度为 O(N)。最坏的情况是待排序数组是逆序的,此时需要比较次数最多,最坏的情况是 O(n^2)