源代码
public static void main(String[] args){
int[] a={20,30,25,2,6,1};
insertSort(a);
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
}
public static void insertSort(int[] a){
int low,high,temp,j;
for(int i=1;i<a.length;i++){
low=0;high=i-1;
temp=a[i];
while(low<=high){
int m=(low+high)/2;
if(a[m]>temp)
high=m-1;
else
low=m+1;
}
for(j=i-1;j>high;j--){ //在high后插入
a[j+1]=a[j];
}
a[j+1]=temp;
}
}
性能分析
1、折半插入排序是一种稳定的排序算法,比直接插入排序明显减少了关键字之间比较的次数,因此速度比直接插入排序算法快,但记录移动的次数没有变,所以折半插入排序算法的时间复杂度仍然为O(n2),与直接插入排序算法相同。
2、当待排序列已是最佳次序时(在本文中“升序”为最佳次序),直接插入排序算法进行 n-1 趟排序后,记录无需移动。由此,直接插入排序最好的时间复杂度为O(n)
3、当n较大时,折半插入排序算法比较次数比直接插入排序要好得多,但是比最好的情况的话,直接插入排序要好得多(此时直接插入排序只比较n-1次)