思想
在直接插入排序的基础上,在插入的时候运用了折半查找法查找要插入的位置,再进行插入。
理解思路的视频
https://www.bilibili.com/video/av38482403
代码实现
function binsertSort(arr) {
var low, high, j, temp;
for (var i = 1; i < arr.length; i++) {
if (arr[i] < arr[i - 1]) {
temp = arr[i];
low = 0;
high = i - 1;
while (low <= high) {
mid = Math.floor((low + high) / 2);
if (temp > arr[mid]) {
low = mid + 1;
} else {
high = mid - 1;
}
}
for (j = i; j > low; --j) {
arr[j] = arr[j - 1];
}
arr[j] = temp;
}
}
}
复杂度分析,两种插入排序对比
因为折半查找比顺序查找要快,所以折半插入排序比直接插入排序要快
最好的情况:本身已经有序,则为O(n)
最坏的情况:逆序,O(n^2)
平均:O(n^2)
折半插入排序和直接插入排序相同点是:元素移动次数不变,不同点是:元素比较次数不同