public class BinaryInsertionSort {
public BinaryInsertionSort(int a[],int length)
{
int temp=0;//哨兵
for(int i=1;i<length;i++) //每個元素依次插入排序
{
int low=0;
int high=i-1;
int j=0;
temp=a[i];
while (high>=low) //折半查找要插入的元素的位置。這裏注意取等號
{
int m=(high+low)/2;
if(temp<a[m])
high=m-1;
else if(temp>a[m])
low=m+1;
else
{
high=m;
break;
}
}
for(int p=i;p>high+1;p--) //移動元素的位置
{
a[p]=a[p-1];
}
a[high+1]=temp;
}
}
public static void main(String[] args) {
int a[] = new int[100];
for (int i = 0; i < a.length; i++) //產生0-10001的數組
a[i]=(int)(Math.random()*1000+1);
//int a[] = {1, 6, 23,21};
new BinaryInsertionSort(a, a.length);
for (int i = 0; i < a.length; i++)
System.out.println(a[i]);
}
}
折半插入排序算法是一種穩定的排序算法,比直接插入算法明顯減少了關鍵字之間比較的次數,因此速度比直接插入排序算法快,但記錄移動的次數沒有變,所以折半插入排序算法的時間複雜度仍然爲O(n^2),與直接插入排序算法相同。附加空間O(1)。
折半查找只是減少了比較次數,但是元素的移動次數不變,所以時間複雜度爲O(n^2)是正確的!