排序算法中可以大致分为以下几类
- 插入类排序:直接插入排序、折半插入排序、希尔排序
- 选择类排序:简单选择排序、堆排序
- 交换类排序:冒泡排序、快速排序
本文介绍插入排序序(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)
}
输出结果:
插入排序的复杂度分析
插入排序的平均时间复杂度也是 O(n^2)
,空间复杂度为常数阶 O(1)
,具体时间复杂度和数组的有序性也是有关联的。
插入排序中,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较 N-1 次,时间复杂度为 O(N)
。最坏的情况是待排序数组是逆序的,此时需要比较次数最多,最坏的情况是 O(n^2)
。