資料結構 演算法 插入排序 希爾排序法

2021-04-27 16:38:37 字數 2262 閱讀 1023

資料結構-演算法: 插入排序(希爾排序法)

希爾排序法基本思想

希爾排序(shell sort)又稱為「縮小增量排序」。是2023年由d.l.shell提出來的。該方法的基本思想是:先將整個待排元素序列分割成若干個子串行(由相隔某 個「增量」的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插 入排序。因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率上比前兩種方法有較大提高。

具體做法:首先確定一組增量d0,d1,d2,d3,...,dt-1()其中n>d0>d1>...>dt-1=1),對於 i=0,1,2,...,t-1,依次進行下面的各趟處理:根據當前增量di將n個元素分成di個組,每組中元素的下標相隔為di;再對各組中元素進行直 接插入排序.

2、下面給出希爾排序演算法的執行過程。

(1)採用希爾排序法排序的各趟的結果如下:

初始:503,17,512,908,170,897,275,653,426,154,509,612,677,765,703,94

第1趟:426,17,509,612,170,765,275,94,503,154,512,908,677,897,703,653

第2趟(d2=4):170,17,275,94,426,154,509,612,503,765,512,653,677,897,703,908

第3趟(d3=2):170,17,275,94,426,154,503,612,509,653,512,765,677,897,703,908

第4趟(d1=1):17,94,154,170,275,426,503,509,512,612,653,677,703,765,897,908

(2)例如,n=8,陣列a的八個元素分別為:17,3,30,25,14,17,20,9。

給定例項的shell排序的排序過程

假設待排序檔案有10個記錄,其關鍵字分別是:

49,38,65,97,76,13,27,49,55,04。

增量序列的取值依次為:

5,3,1

排序過程如【動畫模擬演示】。

shell排序的演算法實現

1. 不設監視哨的演算法描述

using system;

using system.collections.generic;

using system.text;

namespace exshellsorter

arr[j - 1] = t;}}

} static void main(string args)

;shellsorter s = new shellsorter();

s.sort(array);

foreach (int m in array)

console.writeline("", m); }

}}注意:

當增量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在排序前後的相對次序發生了變化。

資料結構 插入排序 希爾排序

一 插入排序 1 介紹 插入排序 insertion sort 的演算法描述是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上,通常採用in place排序 即只需用到o 1 的額外空間的排序 因而在從後向前掃...

資料結構 插入排序 希爾排序

先用簡單的一句話概括,每次用陣列中乙個數字,與他之前的所有資料進行比較,如果滿足條件則更換順序。光這麼說,感覺還是有些晦澀難懂,那我們來舉個例子看看吧,畢竟要學以致用呀,奧利給。1 假設我們現在有乙個陣列 2 那麼我們需要先拿出最前面的兩位 1 進行比較,並且是用最有一位向前進行比較,3 5,那麼交...

資料結構之希爾排序(插入排序)

希爾排序 shell s sort 又稱 縮小增量排序 diminishing increment sort 是插入排序的一種,因d.l.shell於1959年提出而得名。希爾排序的誕生是由於插入排序在處理大規模陣列的時候會遇到需要移動太多元素的問題。希爾排序的思想是將乙個大的陣列 分而治之 劃分為...