1. 程式人生 > >折半插入排序——考研演算法

折半插入排序——考研演算法

一.基本原理

1.核心思想: 折半插入排序在尋找插入位置時,不是逐個比較而是利用折半查詢的原理尋找插入位置 。待排序元素越多,改進效果越明顯。
2.演算法分析:

設陣列為a[0…n]。

  1. 將原序列分成有序區和無序區。a[0…i-1]為有序區,a[i…n] 為無序區。(i從1開始)
  2. 從無序區中取出第一個元素,即a[i],使用二分查詢演算法在有序區中查詢要插入的位置索引j。
  3. 將a[j]到a[i-1]的元素後移,並將a[i]賦值給a[j]。
  4. 重複步驟2~3,直到無序區元素為0。

二.圖例演示:

如上圖所示,以一組資料{15,27,36,53,69}

和42為例,進行折半插入排序的演算法演示:

 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*/ }/*折半插入排序*/

四.效能分析

0、
1 時間複雜度:

(1)順序排列時,只需比較(n-1)次,插入排序時間複雜度為O(n); 
(2)逆序排序時,需比較n(n-1)/2次,插入排序時間複雜度為O(n^2); 
(3)當原始序列雜亂無序時,平均時間複雜度為O(n^2)。

2 空間複雜度:

插入排序過程中,需要一個臨時變數temp儲存待排序元素,因此空間複雜度為O(1)。

3 演算法穩定性:

折半插入排序也是一種穩定的排序演算法,。

下一節預告

下一節將講解插入排序中的希爾排序演算法