折半插入排序是對直接插入排序的改進 , 考慮到直接插入排序將很多開銷放在比較和資料移動上。比較是不可避免的,有沒有什麼辦法可以減少比較的次數呢?於是就想到了折半查詢,每次在查詢到該放的位置時才移動資料。
折半插入排序的思想:當第i個元素要進行排序的時候,它前面的1到i-1位置上的資料是區域性有序的,對於有序的資料序列,採用折半查詢法去判斷在何處插入i位置上的資料,就大大減少了需要比較的次數。
具體實現**如下:
void insertbisort(int arr, size_t size)
for (int j = i - 1; j >=left; --j) //left位置也要移位
arr[left] = temp; //temp放在left位置
}}
上面的是 ,利用二分查詢left和right都是閉區間的 , 記得哪個面試題就考察到了開區間的問題,那我也會把開區間的也寫出來,僅供參考。
void insertbisort1(int arr, size_t size)
for (int j = i; j > left; --j) //取不到left
arr[left] = temp;
}}
時間複雜度
折半插入排序比直接插入排序明顯減少了關鍵字的比較次數,但是移動的次數沒有變化,所以折半插入排序的時間複雜度和直接插入排序都是o(2^n) , 在減少比較的次數方面優化很大。
空間複雜度
折半插入排序和直接插入排序一樣都是需要乙個多餘的快取單元存放第i個元素,所以空間複雜度o(1)
穩定性
因為排序前2個相等的數在序列的前後位置順序和排序後它們兩個的前後位置順序相同,所以它是乙個穩定排序。
插入排序 折半插入排序
折半插入排序 binary insertion sort 直接插入排序採用順序查詢法查詢當前記錄在已排好序的序列中插入位置,這個 查詢 操作可利用 折半查詢 來實 現,由此進行的插入排序稱之為折半插入排序 binary insertion sort 演算法思想 1 將待排序的記錄存放在陣列r 1.n...
插入排序 折半插入排序
折半插入排序是基於直接插入排序的優化。直接插入排序 將第i個元素插入時,通過折半查詢的方式,來查詢第i個元素合適的位置。當0 i 1 位置上的元素都已經排序ok,現需要插入第i個元素,設其值為temp 令low 0,high i,mid high low 2。那麼temp可能插入的位置是 low h...
插入排序 折半插入排序
package sort 折半插入排序 當序列是連續儲存時,對直接插入排序進行的改進 插入位置可以更快速找到 直接插入排序a 0 用作哨兵減少條件判斷,折半插入排序不需要哨兵a 0 位置存放實際元素 public class insertsort 統一後移,空出插入位置 for j i 1 j hi...