排序演算法 2 插入排序

2021-07-03 12:13:08 字數 2121 閱讀 9273

插入排序(insertion sort)的基本思想是:每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子檔案中的適當位置,直到全部記錄插入完成為止。

本節介紹兩種插入排序方法:直接插入排序和希爾排序。

直接插入排序

直接插入排序基本思想

1、基本思想

假設待排序的記錄存放在陣列r[1..n]中。初始時,r[1]自成1個有序區,無序區為r[2..n]。從i=2起直至i=n為止,依次將r[i]插入當前的有序區r[1..i-1]中,生成含n個記錄的有序區。

2、第i-1趟直接插入排序:

通常將乙個記錄r[i](i=2,3,…,n-1)插入到當前的有序區,使得插入後仍保證該區間裡的記錄是按關鍵字有序的操作稱第i-1趟直接插入排序。

排序過程的某一中間時刻,r被劃分成兩個子區間r[1..i-1](已排好序的有序區)和r[i..n](當前未排序的部分,可稱無序區)。

直接插入排序的基本操作是將當前無序區的第1個記錄r[i]插人到有序區r[1..i-1]中適當的位置上,使r[1..i]變為新的有序區。因為這種方法每次使有序區增加1個記錄,通常稱增量法。

插入排序與打撲克時整理手上的牌非常類似。摸來的第1張牌無須整理,此後每次從桌上的牌(無序區)中摸最上面的1張並插入左手的牌(有序區)中正確的位置上。為了找到這個正確的位置,須自左向右(或自右向左)將摸來的牌與左手中已有的牌逐一比較。

一趟直接插入排序方法

1.簡單方法

首先在當前有序區r[1..i-1]中查詢r[i]的正確插入位置k(1≤k≤i-1);然後將r[k..i-1]中的記錄均後移乙個位置,騰出k位置上的空間插入r[i]。

注意:若r[i]的關鍵字大於等於r[1..i-1]中所有記錄的關鍵字,則r[i]就是插入原位置。

2.改進的方法

一種查詢比較操作和記錄移動操作交替地進行的方法。

具體做法:

將待插入記錄r[i]的關鍵字從右向左依次與有序區中記錄r[j](j=i-1,i-2,…,1)的關鍵字進行比較:

① 若r[j]的關鍵字大於r[i]的關鍵字,則將r[j]後移乙個位置;

②若r[j]的關鍵字小於或等於r[i]的關鍵字,則查詢過程結束,j+1即為r[i]的插入位置。

關鍵字比r[i]的關鍵字大的記錄均已後移,所以j+1的位置已經騰空,只要將r[i]直接插入此位置即可完成一趟直接插入排序。

直接插入排序演算法

1.演算法描述

void lnsertsort(seqlist r)

while(increment>1)

} //shellsort

注意:當增量d=1時,shellpass和insertsort基本一致,只是由於沒有哨兵而在內迴圈中增加了乙個迴圈判定條件"j>0",以防下標越界。

2.設監視哨的shell排序演算法

具體演算法【參考書目[12] 】

演算法分析

1.增量序列的選擇

shell排序的執行時間依賴於增量序列。

好的增量序列的共同特徵:

① 最後乙個增量必須為1;

② 應該盡量避免序列中的值(尤其是相鄰的值)互為倍數的情況。

有人通過大量的實驗,給出了目前較好的結果:當n較大時,比較和移動的次數約在nl.25到1.6n1.25之間。

2.shell排序的時間效能優於直接插入排序

希爾排序的時間效能優於直接插入排序的原因:

①當檔案初態基本有序時直接插入排序所需的比較和移動次數均較少。

②當n值較小時,n和n2的差別也較小,即直接插入排序的最好時間複雜度o(n)和最壞時間複雜度0(n2)差別不大。

③在希爾排序開始時增量較大,分組較多,每組的記錄數目少,故各組內直接插入較快,後來增量di逐漸縮小,分組數逐漸減少,而各組的記錄數目逐漸增多,但由於已經按di-1作為距離排過序,使檔案較接近於有序狀態,所以新的一趟排序過程也較快。

因此,希爾排序在效率上較直接插人排序有較大的改進。

3.穩定性

希爾排序是不穩定的。參見上述例項,該例中兩個相同關鍵字49在排序前後的相對次序發生了變化。

排序演算法 2 插入排序

思路是 每次從未排好的序列中選出第乙個元素插入到已排好的序列中。步驟可以大致歸納如下 1.從未排好的序列中拿出首元素,並把它賦值給temp變數 2.從排好的序列中,依次與temp進行比較,如果元素比temp大,則將元素後移 實際上放置temp的元素位置已經空出 3.直到找到乙個元素比temp小,將t...

排序演算法2 插入排序

插入排序的中心思想就是將乙個元素插入到已經排好序的陣列當中。陣列a n 初始時,a 0 自成一格有序區,無序區為a 1 n 1 令i 1 將a i 併入當前有序區a 0 i 1 中形成有序區間 i 並重複第二步直到 i n 1 include include include myfunctions....

排序演算法2 插入排序

插入排序是通過不斷插入待排序的元素完成整個排序過程。插入排序是一種很簡單的排序方式,基本思想就是將乙個元素插入到已經排序好的序列中,從而形成乙個新的有序序列。它重複地選擇未排序的元素,將其插入已經排序好的序列中,直到沒有待排序元素時,整個排序過程完成。插入排序的工作方式就像大家打撲克牌時抓牌一樣。開...