折半插入:考虑到插入第i个元素前面的i-1个元素是有序的,计算0~i-1的中间点,和i个元素进行比较,这样完成了折半。然后不停地用上面的步骤,快速的找出第i个元素的位置。
时间复杂度:折半插入排序比直接插入排序明显减少了关键字之间的比较次数,但是移动次数是没有改变。所以,折半插入排序和插入排序的时间复杂度相同都是O(N^2),在减少了比较次数方面它确实相当优秀,所以该算法仍然比直接插入排序好。
空间复杂度:折半插入排序和插入排序一样只需要一个多余的缓存数据单元来放第 i 个元素,所以空间复杂度是O(1),因为排序前2个相等的数在序列的前后位置顺序和排序后它们两个的前后位置顺序相同,所以它是一个稳定排序。
//折半插入排序
public static void insertHalfSort(int a[]){
int i=0,j=0;
for(i=0;i<a.length;i++){
int low=0;
int high=i-1;
//不断折半
while(low<=high){
int mid=(low+high)/2;
if(a[i]<a[mid])high=mid-1;
else low=mid+1;
}
//整体后移
int temp=a[i];
for(j=i;j>low;j--){
a[j]=a[j-1];
}
a[j]=temp;
}
}