折半插入排序(binary insertion sort)是對插入排序算法的一種改進,由於排序算法過程中,就是不斷的依次將元素插入前面已排好序的序列中。由於前半部分為已排好序的數列,這樣我們不用按順序依次尋找插入點,可以采用折半查找的方法來加快尋找插入點的速度。
折半插入排序算法的具體操作為:在將一個新元素插入已排好序的數組的過程中,尋找插入點時,將待插入區域的首元素設置為a[low],末元素設置為a[high],則輪比較時將待插入元素與a[m],其中m=(low+high)/2相比較,如果比參考元素小,則選擇a[low]到a[m-1]為新的插入區域(即high=m-1),否則選擇a[m+1]到a[high]為新的插入區域(即low=m+1),如此直至low<=high不成立,即將此位置之后所有元素后移一位,並將新元素插入a[high+1]。
折半插入排序算法是一種穩定的排序算法,比直接插入算法明顯減少了關鍵字之間比較的次數,因此速度比直接插入排序算法快,但記錄移動的次數沒有變,所以折半插入排序算法的時間復雜度仍然為O(n^2),與直接插入排序算法相同。
/**
* 折半查找排序
*/
public static void bInsertSort(int[] temp) {
int length = temp.length;
for (int i = 1; i < length; i++) {
int tempVal = temp[i];
int low = 0;
int high = i - 1;
while (low <= high) {
int middle = (low + high) / 2;
//tempVal < temp[middle] 升序
//tempVal > temp[middle] 降序
if (tempVal < temp[middle])
high = middle - 1;
else
low = middle + 1;
}
for (int j = i; j > high + 1; j--)
temp[j] = temp[j - 1];
temp[high + 1] = tempVal;
}
}
public static void main(String[] args) {
int[] a = { 5, 1, 76, 2, 4, 84, 36, 22, 62, 90 };
bInsertSort(a);
System.out.println("排序后:");
for (int i = 0; i < a.length; i++){
System.out.print(a[i] + " ");
}
}
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。