之前我們總結了比較簡單的幾種排序方法。冒泡,選擇,排序。但是也提到了這些排序方法的缺陷。時間複雜度太高,在有大量資料需要排序的時候,會需要浪費太多的時間。所以在很多場景中是不適合使用。我們這次總結一種時間複雜度更優秀的希爾排序。
希爾排序是以插入排序為基礎的改進版本。是由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...