插入排序原理:
插入排序是从数组中的第二个数开始,往前比对,如果它大于第一个数,就插入到这个数的前面,小于的话就插入到后面。此时,前两个数就排好顺序了。从第三个数开始,再往前比对,如果大于某个数就插入到该数的前面。以此类推,就由小到大排好了顺序
插入排序代码原理:
插入排序是从数组中的第二个数开始,我们保存一下这个数值,拿着这个当前保存数想要往前插入。如果第一个数是大于当前数的话,就将第一个数的值赋值给第二个数,再往前比对发现没有数值,停止比对。再把最小数赋值给相应位置上。后面的数,以此类推。
举例: 给一个乱序的数组:[8,5,6,3] 从5开始也是两个遍历,外层的遍历是5右边的,用下标i表示。内层的遍历是从5左边的,用下标j表示。也就说不断的把右边的某个数,不断的和左边的比较
第一次:i:1 j=i=1 current:5 5比较左边j-1的下标,也就是8,8>5 把8赋值给5 就变成[8,8,6,3]。j-1=0,此时j是表示循环结束后要修改的数组下标的值。目前,左边没值了,内循环结束,把5赋值给了arr[j]也就是arr[0]==> [5,8,6,3]
第二次:i:2 j=i=2 current:6 8>6==>[5,8,8,3] j-1=1 , 5<6,左边没值了循环停止,将当前值6赋值给arr[j]===arr[1]=6 ==>[5,6,8,3]
第三次:i:3 j=i=3 current:3 8>3==>[5,6,8,8] j-1=2 , 6>3==>[5,6,6,8] j-1=1, 5>3==>[5,5,6,8] j-1=0,左边没值了循环停止,将当前值3赋值给arr[j]===arr[0]=3 ==>[3,6,8,3]
代码
function insertSort(array){
for (let i = 1; i < array.length; i++) {
let current=array[i]
let j=i
while( array[j-1]>current && j>0){
array[j]=array[j-1]
j--
}
array[j]=current
}
return array
}
console.log(insertSort([8,5,9,2])); // [2, 5, 8, 9]
时间复杂度
最好情况:O(n)
一般情况:O(n²)
最坏情况:O(n²)
小结
插入排序的举例用文字确实不好描述,想要彻底明白最好把代码复制到vscode,打上断点,在浏览器一点点看。然后自己在纸上比比划划就清楚了。它大致的精神就是从第二个数开始,先记录它,从右边遍历,每个数又和左边的比较,如果左边的大,那么就把这个大值赋值给右边的值,然后j--,表示记录了小值的位置。该次内循环结束后,再把当前值赋给记录的小值。由于右边的循环有两个条件,所以用while可能更合适一些。