折半插入解析(binary insert sort)
1. 基本描述
基于直接插入排序。在此基础上只是改进了搜索机制。
### 区别
直接插入排序 是从右侧基于前面是有序数组的思维去判断。一边寻找,一边从右往左,k+1=k形式 去替换
折半插入排序 是设置了low 和 high 两个参数,去所有在前面有序数组。利用折半查找找到对应位置。 在去做循环替换。
稳定性 稳定
时间复杂度
$$
O(n^2)
$$
空间复杂度
$$
O(1)
$$
2.low high 机制
low 一开始等于0 ,high 则为 i-1。每次都是去更新low,或者high
问题出现在结果,由于是除二,除了开始 0,是得不到长度为 2 的数组。其余都能找长度为2的数组,在最后。然后再去除,最后low = high =mid ,长度为一的数组。。
同样,需要注意的是最后low high 结果去表示 插入位置,这边是采用low,其实high也可以。由于机制是
while (low <= high) {
int mid = (low + high) / 2;
if (temp < array[mid]) {
high = mid - 1;
} else
low = mid + 1;
}
所以在最后low=mid(数组位置除二),如果temp是大于mid,low+1。low=low+1就是插入位置.如果temp小于mid。low 不变。high-1。表示的是 low 就是插入位置。
接下来很简单了,low=low+1 或者low=low。 就是应该插入的位置。
和直接插入排序一样,往右边移动即可。关键是参数设置的不同。本质上一样
for (int j = i; j >= low + 1; j--)
array[j] = array[j - 1];
array[low] = temp;
3.代码
public class BinaryInsertSort {
public static void BinaryinsertSort(int array[]) {
// int i, j, k;
for (int i = 1; i < array.length; i++) {
int temp = array[i];
int low = 0;
int high = i - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (temp < array[mid]) {
high = mid - 1;
} else
low = mid + 1;
}
for (int j = i; j >= low + 1; j--)
array[j] = array[j - 1];
array[low] = temp;
}
}
public static void main(String[] args) {
int[] array = {1, 2, 3, 0};
BinaryinsertSort(array);
for (int i : array
) {
System.out.println(i);
}
System.out.println(array);
}
}