function insertSort(alist){
let preindex,current;
for(let i=1;i<alist.length;i++){
preindex=i-1;
current=alist[i]
while(preindex>=0&&alist[preindex]>current){
alist[preindex+1]=alist[preindex]
preindex--
}
alist[preindex+1]=current
}
return alist
}
insertSort([5,9,6,3,4,5])
这段插入排序的JavaScript代码的运行过程如下:
1. 首先,定义了两个变量preIndex和current。preIndex用于保存当前元素的前一个元素的索引,current用于保存当前元素的值。
2. 外层循环for (let i = 1; i < len; i++)用于控制排序的轮数,从第二个元素开始,因为第一个元素默认已经被排序。
3. 在每一轮开始时,将当前的索引i - 1赋值给preIndex,将当前元素的值赋值给current。
4. 内层循环while (preIndex >= 0 && arr[preIndex] > current)用于控制每一轮的比较次数,如果前一个元素的值大于当前元素的值,就将前一个元素后移一位。
5. 在每一轮结束后,将current插入到正确的位置,即preIndex + 1。
6. 最后,返回排序后的数组。
这个过程会重复n-1次(n是数组的长度),在每次循环中,都会将当前元素插入到已排序序列的正确位置,最终得到一个升序的数组。
一、为什么while循环中preindex要大于等于零
因为在插入排序中,preIndex表示当前元素前一个元素的索引。在while循环中,我们需要比较当前元素和它前面的元素,如果前面的元素大于当前元素,我们就将前面的元素后移一位。
preIndex >= 0这个条件是为了防止数组越界。当我们处理到数组的第一个元素时,preIndex的值为-1,如果我们继续让preIndex减小,那么在访问arr[preIndex]时就会出现数组越界的错误。因此,我们需要在preIndex >= 0的条件下进行循环,以确保我们访问的数组元素是有效的。
二、最后一步是什么意思?
alist[preindex+1]=current这行代码的作用是将current(当前元素)插入到正确的位置。
在插入排序中,我们首先假设第一个元素已经被排序。然后,从第二个元素开始,我们将其与前面已排序的元素进行比较。如果当前元素小于前面的元素,我们就将前面的元素后移一位,然后继续比较,直到找到一个元素不大于当前元素或者已经没有元素可以比较。
此时,preIndex + 1就是当前元素应该插入的位置,因为preIndex是最后一个大于当前元素的元素的索引。所以,我们将当前元素current赋值给alist[preIndex + 1],完成插入操作。