折半插入排序


  折半插入排序(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] + " ");

}


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: