折半插入排序——考研演算法
阿新 • • 發佈:2018-12-30
一.基本原理
1.核心思想: 折半插入排序在尋找插入位置時,不是逐個比較而是利用折半查詢的原理尋找插入位置 。待排序元素越多,改進效果越明顯。
2.演算法分析:
設陣列為a[0…n]。
- 將原序列分成有序區和無序區。a[0…i-1]為有序區,a[i…n] 為無序區。(i從1開始)
- 從無序區中取出第一個元素,即a[i],使用二分查詢演算法在有序區中查詢要插入的位置索引j。
- 將a[j]到a[i-1]的元素後移,並將a[i]賦值給a[j]。
- 重複步驟2~3,直到無序區元素為0。
二.圖例演示:
如上圖所示,以一組資料{15,27,36,53,69}
1. 初始化:預設low下標為0,high下標為4,mid=(low+high)/2;
2. 第一次對比:a[mid]=36<42,則low=mid+1;
3. 第二次對比:mid=(3+4)/2=3,a[mid]=53>42;則high=mid-1;
4. 查詢結束:此時high<low,跳出迴圈,原a[mid]後的數後移;
5. 插入:a[mid]=42;
三.程式碼實現
void BinsertSort(RedType L, int n)
{ int i,low,high,mid;
for(i=2; i<= n; ++i){
L[0]=L[i]; /* r[0]作為監視哨*/
low=1; high=i-1;
While(low<=high)
{mid=(low+high)/2;
if (L[0].key<L[mid].key) high=mid-1; //插入點在低半區
else low=mid+1; }
for( j=i-1; j>=high+1; j )
L[j+1]=L[j]; /* 記錄後移*/
L[high+1]=L[0]; /* 插入*/
} /* for*/
}/*折半插入排序*/
四.效能分析
1 時間複雜度:
(1)順序排列時,只需比較(n-1)次,插入排序時間複雜度為O(n);
(2)逆序排序時,需比較n(n-1)/2次,插入排序時間複雜度為O(n^2);
(3)當原始序列雜亂無序時,平均時間複雜度為O(n^2)。
2 空間複雜度:
插入排序過程中,需要一個臨時變數temp儲存待排序元素,因此空間複雜度為O(1)。
3 演算法穩定性:
折半插入排序也是一種穩定的排序演算法,。
下一節預告
下一節將講解插入排序中的希爾排序演算法