從上一小節可見,直接插入排序算法簡便、容易實現。當待排序元素的數量 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 )。