C語言排序演算法總結 希爾排序

2021-10-18 19:29:43 字數 1353 閱讀 9844

之前我們總結了比較簡單的幾種排序方法。冒泡,選擇,排序。但是也提到了這些排序方法的缺陷。時間複雜度太高,在有大量資料需要排序的時候,會需要浪費太多的時間。所以在很多場景中是不適合使用。我們這次總結一種時間複雜度更優秀的希爾排序。

希爾排序是以插入排序為基礎的改進版本。是由shell提出的方法。所以就叫希爾排序了。。

插入排序的基本思路是:將元素插入到乙個有序的元素集合中。在使用插入排序時,我們是乙個接乙個的。

希爾排序的思想是:先確定乙個flag,將待排序陣列分為幾個小組。分組方式是:將間隔為flag的資料設為一組。完成一輪插入排序後,縮小flag,再進行第二輪插入排序。直到flag縮小到一。

當我們有乙個初始序列時: 9125748635

加入我們在開始時,假設gap為5,則序列分組像這樣的

也就是每兩個元素為一組。 這時候我們就像是使用插入排序,對五組只有兩個元素的序列進行排序。於是排序好的序列為:

4 1 2 3 5 9 8 6 5 7

第一趟排序結束後,我們再對排序好的元素以gap=2來分組。

當gap為2時,序列被分為了兩組。也就是第二躺我們其實對兩組有五個元素的序列進行插入排序。排序完成後:

最後當gap為1時,我們就是對整個序列進行插入排序。得到最終的排序結果:

1 2 3 4 5 5 6 7 8 9

**其實也比較簡單,直接插入排序的間隔是1,所以我們在寫希爾排序的時候,需要改變間隔。也就是額外設定乙個gap。以及我們需要注意迴圈的結束。因為也許並不是每一次分組後,每組的資料個數都是一樣的。所以要注意越界問題。

我們在這裡設定的gap為上一次的三分之一。

具體的**行為:

gap=gap/3+

1;

末尾需要加1,是為了放置gap在這裡變成0,如果上一次gap為2時,這時再2/3 ,結果會變成0,就會出現問題。

int

*shellsort

(int

* data,

int nums)

else

break;}

data[end + gap]

= tmp;}}

return data;

}

C用語言排序演算法 希爾排序(例項)

希爾排序 在直接插入排序的思想下設定乙個最小增量dk,剛開始dk設定為n 2。進行插入排序,隨後再讓dk dk 2,再進行插入排序,直到dk為1時完成最後一次插入排序,此時陣列完成排序。include 進行插入排序 初始時從dk開始增長,每次比較步長為dk void insrtsort int a,...

C語言排序演算法之「希爾排序法」

演算法思想簡單描述 在直接插入排序演算法中,每次插入乙個數,使有序序列只增加1個節點,並且對插入下乙個數沒有提供任何幫助。如果比較相隔較遠距離 稱為增量 的數,使得數移動時能跨過多個元素,則進行一次比較就可能消除多個元素交換。d.l.shell於1959年在以他名字命名的排序演算法中實現了這一思想。...

排序演算法總結(四)希爾排序

希爾排序又稱縮小增量排序,是插入排序的一種。它的基本思想是先將整個待排記錄序列分割成若干個子串行,然後對這若干個子串行分別進行直接插入排序,等到待排序列基本有序時,再對整個序列進行直接插入排序。比如如下陣列,先已step 5進行分割。49,38,65,97,76,13,27,49,55,4 由於st...