1.算法思路
是在插入第i个元素时(i前面的元素必定是有序的),对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,
如果小,则对前半再进行折半,否则对后半进行折半,
直到left>right,然后再把第i个元素前1位与目标位置之间的所有元素后移,
再把第i个元素放在目标位置上。
2.特点分析
二分法直接插入排序算法是插入排序的升级版本,
但是时间复杂度和直接插入算法一样都是O(n²)
那么二分法为什么是插入排序的升级版本呢
因为直接插入排序的操作步骤是很多的
二分插入排序能够减少排序的步骤
和插入排序一样,适用于小规模数据或者有序性比较高的数组
3.思路分析
4.代码实现
public class BinaryInsertSort {
public static void main(String[] args) {
//定义数组
int[] a = {48,85,99,145,14,1,78,23,66,99,845,1024,25,99,88,44,66,22,14,256,24};
Sort(a);
}
/*
思路: 主要分两步吧,也就是基本的插入排序思路
1. 找到啊a[i]应该插入的位置
2.把大于a[i]的往后移动一位,把a[i]插入应当位置
*/
private static void Sort(int[] a) {
for(int i = 0;i < a.length;i ++) {
//取出要比较的数
int temp = a[i];
//设置left right mid
int left = 0;
int right = i - 1;
int mid = 0;
//找a[i]应该插入的位置
while(left <= right) {
mid = (left + right)/2;
if (temp > a[mid]) {
left = mid + 1;
}else {
right = mid + -1;
}
}
//把大于a[i]的向后移动一位
for(int j = i -1;j >= left;j --) {
a[j + 1] = a[j];
}
//插入a[i]
if (left != i) {
a[left] = temp;
}
}
System.out.println(Arrays.toString(a));
}