活动地址:CSDN21天学习挑战赛
*学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
最近学习很闹,之后的算法理解学习概念,把掌握的前面的巩固
学习专栏地址
文章
思路
- 将待排序的序列的第一个元素看做一个有序序列,
- 把第二个元素到最后一个元素当成是未排序序列。
- 从头到尾依次扫描未排序的序列,将扫描到的每个元素插入有序序列的适当位置。
- 折半插入排序根据二分查找法在有序序列中查找合适的位置将还未排序的元素插入。
- (在这里需要注意一个问题,如果在有序序列中有一个和待插入的元素相等,则将待插入的元素查到此元素的后面,这样方式的插入排序是稳定的。
js 实现
let arr = [];
let low,high,m,temp;
for (let i = 1; i < len; i++){
//先通过二分查找在有序序列中找到无序元素合适的插入位置,在通过数组元素后移,将无序元素插入其中
low = 0;
high = i - 1;
temp = arr[i];
//最后退出while循环的时候,low>high
//high指向待插入位置的前一位,而low指向待插入位置
while (low <= high){
//找到有序序列中间位置
m = (low + high) / 2;
//将无序元素和中间元素值进行比较,看该元素是比中间元素大,还是比中间元素小
if (arr[i] >=arr[m]) { low = m + 1; }
else { high = m - 1; }
}
//找到合适位置,此时进行有序序列元素后移,腾出空间存放无序元素
for (let j = i - 1; j > high; j--) {
arr[j + 1] = arr[j];
}
arr[j + 1] =temp;
}