插入排序(直接插入和Shell排序)

2021-07-04 14:32:36 字數 2308 閱讀 1560

1.直接插入排序

1) 定義

直接插入排序(straight insertion sort )是一種最簡單的排序方法。它的基本操作是將乙個記錄插入到乙個長度為m (假設)的有序表中,使之仍保持有序,從而得到乙個新的長度為m +1 的有序表。

2)  演算法思路

設有一組關鍵字{k 1 ,k 2 ,…,k n };排序開始就認為k 1 是乙個有序序列;讓k 2 插入上述表長為1 的有序序列,使之成為乙個表長為2的有序序列;然後讓k 3 插入上述表長為2 的有序序列,使之成為乙個表長為3 的有序序列;依次類推,最後讓k n 插入上述表長為n-1 的有序序列,得乙個表長為n 的有序序列。

【例】設有一組關鍵字序列{55 ,22 ,44 ,11 ,33 },這裡n=5 ,即有5 個記錄。請將其按由小到大的順序排序。排序過程如圖9.1所示。

第一趟:[55]   22   44  11  33 

第二趟:[22     55]   44   11  33

第三趟:[22     44   55]   11  33

第四趟:[11     22     44    55] 33

結果:[11     22      33   44   55 

3)具體演算法

template

void stinsort (t r,int n)

r[j+1]=r[0];        //將r[0]即原r[i]記錄內容,插到r[j]後一位置}

}    //sinsort

4) 演算法時間複雜度

此演算法外迴圈n-1 次,在一般情況下內迴圈平均比較次數的數量級為o(n) ,所以演算法總時間複雜度為o(n2) 。

5)直接插入排序的穩定性

直接插入排序是穩定的排序方法

2.折半插入排序

1) 定義

當直接插入排序進行到某一趟時,對於r[i].key 來講,前邊i-1 個記錄已經按關鍵字有序。此時不用直接插入排序的方法,而改為折半查詢,找出r[i].key 應插的位置,然後插入。這種方法就是折半插入排序(binary insertion sort )。

2) 具體演算法

template

void binasort(t r,int n)

//結果在1位置

for(j=i-1;j>=1;j--)a[j+1]=a[j];

a[1]=a[0];

}}  //binasort

3) 折半插入排序的時間複雜度

折半插入排序,關鍵字的比較次數由於採用了折半查詢而減少,數量級為o(nlog 2 n) ,但是元素移動次數仍為o(n2 ) 。故折半插入排序時間複雜度仍為o(n2 ) 。折半插入排序方法是穩定的。

3.希爾排序

1) 定義

希爾排序(shell sort )是d .l.希爾(d.l.shell )提出的「縮小增量」的排序方法。它的作法不是每次乙個元素挨乙個元素的比較。而是初期選用大跨步(增量較大)間隔比較,使記錄跳躍式接近它的排序位置;然後增量縮小;最後增量為1 ,這樣記錄移動次數大大減少,提高了排序效率。希爾排序對增量序列的選擇沒有嚴格規定。

2) 演算法思路

①先取乙個正整數d1(d 1 <;n) ,把全部記錄分成d1個組,所有距離為d1的倍數的記錄看成一組,然後在各組內進行插入排序;

②然後取d2( d2 < d1 ) 。

③重複上述分組和排序操作;直到取di=1(i>=1) ,即所有記錄成為乙個組為止。一般選d1約為n/2 ,d2為d 1 /2 ,d3為d 2 /2 ,…,d i =1 。

3) 具體演算法

template

void shell(t r,int n)         //希爾排序

r[j+k]=r[0];

}k=k/2;}}

4) 演算法分析

當k=1時,此演算法就等同於直接插入排序方法。由於前邊大增量的處理,使關鍵字大體有序,因此最後一趟排序移動的記錄少,處理速度快。

有人在大量實驗基礎上推出,它的時間複雜長為o(n 1.3 ) 。如果對關鍵字序列 進行希爾排序,可以看出希爾排序是不穩定的。

插入排序 直接插入排序和shell排序

1.排序的分類 2.直接插入排序 1 演算法思想 直接插入排序是一種簡單的排序演算法,將第乙個元素看作有序子串行,從第二個元素開始,和前乙個元素比較,若小於,將前乙個元素向後移,將第二個元素插入到有序子串行中 若大於,直接將第二個元素插入到有序子串行中。按這種過程繼續下去,直到完成所有的有序子串行。...

插入排序 直接插入

包括 直接插入排序,二分插入排序 又稱折半插入排序 鍊錶插入排序,希爾排序 又稱縮小增量排序 屬於穩定排序的一種 通俗地講,就是兩個相等的數不會交換位置 直接插入排序是一種簡單的插入排序法,其基本思想是 把待排序的記錄按其關鍵碼值的大小逐個插入到乙個已經排好序的有序序列中 直到所有的記錄插入完為止,...

插入排序(直接插入)

今天學習了插入排序,現在將它們整理出來,如果有不對的地方,歡迎批評指正 插入排序的思想就是將乙個待排資料,按照其大小插入到乙個已經排好的資料中的適當位置,知道插入完畢 截了乙個圖如下 排序的過程就是這樣。驗證 如圖 這裡的迴圈我是從最後乙個數開始的 如下 function insersort arr...