这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战
插入排序
- 插入排序:每次排
一个
数组项,以此方式构建最后的排序数组。 - 实现思路:假定第一项已经排序了,接着,拿它和第二项进行比较,以此来确定,第二项是应该待在原位还是插到第一项之前。这样的话,我们前两项就已经正确排序,接着和第三项进行比较(确定它是该插入到第一、第二还是第三的位置),以此类推。
实现
function insertSort(arr) {
// 声明需要用到的变量
let len = arr.length;
let j = null;
let temp = null;
// 遍历要排序的数组,按照我们上边的实现思路:
for (let i = 1; i < len; i++) {
// 先假设第一项已经排好顺序了,此时待排序的项就是数组的第二项,也就是下标为1的项,(这就是我们i从1开始循环的原因),同时我们将待排序的值缓存到temp临时变量中,方便我们后续将其插入到正确的位置
j = i;
temp = arr[i];
// 只要j大于0(数组索引最小为0)且数组中前一项的值比待比较的值大,那么我们就将这个值移动到当前位置上,并且减小 j
while (j > 0 && arr[j - 1] > temp) {
arr[j] = arr[j-1]
j--
}
// 最终将 temp 插入到 正确的位置
arr[j] = temp
}
}
解析
- 比方说 待排序数组是
[3, 5, 1, 4, 2]
- 首先假定 3 已经排序,从数组的第二项 5 开始遍历,3比5小,所以 3 待在原位。
- 接着 i 变为了 2,将其赋值给j,即此时要比较的是 数组的5 和 1,5比1大,所有两者调换位置,将 j 减 1,此时进行 3和1比较,3比1大,两者调换位置,j减 1,此时j等于0了,跳出while循环, 将待排序的temp(即此时的1),放到了数组下标为j的位置,即此时的第0位。到此数组的暂时顺序是
[1, 3, 5, 4, 2]
- 然后再次循环数组,此时i为 3,根据上述的步骤得出此轮结束之后的数组为
[1, 3, 4, 5, 2]
- 接着是 i 为 4,得出的数组为
[1, 2, 3, 4, 5]
,至此数组排序完成。