插入排序 折半插入排序

2021-07-08 22:23:08 字數 1696 閱讀 9031

折半插入排序(binary insertion sort)

直接插入排序採用順序查詢法查詢當前記錄在已排好序的序列中插入位置,這個「查詢」操作可利用「折半查詢」來實

現,由此進行的插入排序稱之為折半插入排序(binary insertion sort)。

[演算法思想]

1)將待排序的記錄存放在陣列r[1..n]中,r[1]是乙個有序序列。

2)迴圈n-1次,每次使用折半查詢法,查詢r[i]插入表長為i-1的有序序列r[1..i-1],直到將r[n]插入表長為n-1的有序序列

r[1..n-1],最後得到乙個表長為n的的有序序列。

[演算法描述]

void binsertsort(int r,int length)

for(int j = i-1;j >= high+1;--j) r[j+1] = r[j]; /* j記錄後移 */

r[high+1] = r[0]; /* 將r[0]即原r[i],插入到正確位置 */

}}

[演算法分析]1.時間複雜度從時間上比較,折半查詢比順序查詢塊,所以就平均效能來說,折半插入排序優於直接插入排序。

折半插入排序所需要的關鍵字比較次數與待排序序列的初始排列無關,僅依賴於記錄的個數。不論初始序列情況如

何,在插入第i個記錄時,需要經過log2i+1次比較,才能確定它應插入的位置。

所以當記錄的初始排序為正序或接近正序時,直接插入排序比折半插入排序執行的關鍵字比較次數要少。

折半插入排序的物件移動次數與直接插入排序相同,依賴於物件的初始排列。在平均情況下,折半插入排序僅減少

了關鍵字間的比較次數,而記錄的移動次數不變。

因此,折半插入排序的時間複雜度仍為(n^2)。 

2.空間複雜度

折半插入排序所需附加儲存空間和直接插入排序相同,只需要乙個記錄的輔助空間r[0],所以空間複雜度為o(1)。

[演算法特點]

1)是穩點排序。

2)因為要進行折半查詢,所以只能用於順序結構,不能用於鏈式結構。

3)適合初始記錄無序、n較大時的情況。   

[完整**]

#includeusing namespace std;

void binsertsort(int r,int length)

for(int j = i-1;j >= high+1;--j) r[j+1] = r[j]; /* j記錄後移 */

r[high+1] = r[0]; /* 將r[0]即原r[i],插入到正確位置 */ }}

int main()

; /* 注意,a[0]為監視哨 */

binsertsort(a,11);

for(int i=1;i<11;i++)

cout<

[執行結果]

插入排序 折半插入排序

折半插入排序是基於直接插入排序的優化。直接插入排序 將第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...

1 2插入排序 折半插入排序

1.2插入排序 折半插入排序 binary insertion sort 一.評估 穩定的排序演算法 時間複雜度o n 2 移動次數 最小值n 1,最大值 n 2 n 1 2,平均值 n 2 4。與直接插入相比較少了比較的次數。二.思想 逐一插入,折半比較。r 0 作用 哨兵 監視哨 暫存器。voi...