java折半插入排序

從上一小節可見,直接插入排序算法簡便、容易實現。當待排序元素的數量 n 很小時,

這是一種較好的排序方法,但是通常待排序元素數量 n 很大,則不宜採用直接插入排序方法,

此時需要對直接插入排序進行改進。

直接插入排序的基本操作是向有序序列中插入一個元素,插入位置的確定是通過對有序

序列中元素按關鍵字逐個比較得到的。既然是在有序序列中確定插入位置,則可以不斷二分

有序序列來確定插入位置,即搜索插入位置的方法可以使用折半查找實現。

折半插入排序的實現如代碼。

算法  binInsertSort

輸入:數據元素數組 r,數組 r 的待排序區間[low..high]

輸出:數組 r 以關鍵字有序

代碼:

public void binInsertSort(Object[] r, intlow, int high){

for (int i=low+1; i<=high; i++){

Object temp = r[i]; //保存待插入元素

int hi = i-1; int lo = low;  //設置初始區間

while (lo<=hi){  //折半確定插入位置

int mid = (lo+hi)/2;

if(strategy.compare(temp,r[mid])<0)

hi = mid - 1;

else lo = mid + 1;

}

for (int j=i-1;j>hi;j--) r[j+1] = r[j];//移動元素

r[hi+1] = temp;  //插入元素

}//for

}

從算法binInsertSort 容易看出,折半插入排序所需的輔助空間與直接插入排序相同,從時間上比

較,折半插入排序僅減少了元素的比較次數,但是並沒有減少元素的移動次數,因此折半插

入排序的時間複雜度仍爲O(n 2 )。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章