排序 插入排序

2021-07-25 13:20:43 字數 2624 閱讀 6334

(一) 插入排序

1. 直接插入排序(insert sorting)

基本思想: 當插入第i (i≥1) 個元素時,前面的v[0], v[1], …, v[i-1]已經排好序。這時,用v[i]的排序碼與v[i-1], v[i-2], …的排序碼順序進行比較,找到插入位置即將v[i]插入,原來位置上的元素向後順移。

時間複雜度:o(n^2)

穩定性:穩定的

基本方法:每步將乙個待排序的元素,將其排序碼的大小,插入到前面已經排好序的一組元素的適當位置,知道元素全部插入為止。

**示例:

/*

**直接插入排序

*/void insertsort(int a, int

len)

a[j+1] = key;}}

2.折半排序基本思想 : 設在順序表中有一 個元素序列 v[0], v[1], …, v[n-1]。其中, v[0], v[1], …, v[i-1] 是已經排好序的元素。在插入v[i] 時, 利用折半搜尋法尋找v[i] 的插入位置。

演算法分析:

折半搜尋比順序搜尋快, 所以折半插入排序就

平均效能來說比直接插入排序要快。

它所需的排序碼比較次數與待排序元素序列的初始排列無關,僅依賴於元素個數。在插入第 i 個元素時,需要經過 log2i +1 次排序碼比較, 才能確定它應插入的位置。因此,將 n 個元素(為推導方便, 設為 n=2k ) 用折半插入排序所進行的排序碼比較次數為:

當 n 較大時,總排序碼比較次數比直接插入排序的最壞情況要好得多,但比其最好情況要差。

在元素的初始排列已經按排序碼排好序或接近有序時,直接插入排序比折半插入排序執行的排序碼比較次數要少。折半插入排序的元素移動次數與直接插入排序相同,依賴於元素的初始排列,所以時間複雜度:o(n^2)

穩定性:穩定的

**描述:

int binaryinsertsort()  

//找到high,high+1就是i要插入的位置

for(j = i-1; j>= high + 1; j--)

irawbuff[j+1] = irawbuff[0];

printf("第%d趟:\n",i-1);

for(int k = 0; k < icount; k++)

std::cout

<<:endl>

}

return

0;

}

3.希爾排序希爾排序方法又稱為縮小增量排序。該方法的基本思想是 :

①設待排序元素序列有 n 個元素, 首先取乙個整數 gap < n 作為間隔,將全部元素分為 gap 個子序列,所有距離為 gap 的元素放在同乙個子串行中,在每乙個子串行中分別施行直接插入排序。

②然後縮小間隔 gap, 例如取 gap = gap/2,重複上述的子串行劃分和排序工作。直到最後取 gap == 1,將所有元素放在同乙個序列中排序為止。

開始時 gap 的值較大,子串行中的元素較少,排序速度較快; 隨著排序進展,gap 值逐漸變小, 子串行中元素個數逐漸變多,由於前面工作的基礎,大多數元素已基本有序,所以排序速度仍然很快。

演算法分析

穩定性:不穩定

gap的取法有多種。最初 shell 提出取 gap = n/2,gap = gap/2,直到gap = 1。knuth 提出取 gap = gap/3 +1。還有人提出都取奇數為好,也有人提出各 gap 互質為好。

對特定的待排序元素序列,可以準確地估算排序碼的比較次數和元素移動次數。

想要弄清排序碼比較次數和元素移動次數與增量選擇之間的依賴關係,並給出完整的數學分析,還沒有人能夠做到。

knuth利用大量實驗統計資料得出 : 當 n 很大時,排序碼平均比較次數和元素平均移動次數大約在 n1.25 到 1.6n1.25 的範圍內。這是在利用直接插入排序作為子串行排序方法的情況下得到的。

例:關鍵字序列

gap=3時,三個下標為1的相比較,排出大小,三個下標為2的相比較排出大小,兩個下標為2的相比較排出大小。

結果如圖所示。

gap=2和gap=1如同gap=3.

**示例:

void shellsort2(int a, int n)  

a[k + gap] = temp;

} }

插入排序 折半插入排序

折半插入排序 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...

插入排序 希爾插入排序

本文借鑑於lsgo實驗室創始人馬老師 演算法 希爾插入排序 delta len nums 2 while delta 0 shell delta,nums delta delta 2return nums defshell delta,key for i in range delta,len key...