排序演算法總結之希爾排序

2021-09-22 09:14:20 字數 2506 閱讀 5697

一,希爾排序演算法介紹

①希爾排序又稱縮小增量排序 ,它本質上是乙個插入排序演算法。為什麼呢?

因為,對於插入排序而言,插入排序是將當前待排序的元素與前面所有的元素比較,而希爾排序是將當前元素與前面增量位置上的元素進行比較,然後,再將該元素插入到合適位置。當一趟希爾排序完成後,處於增量位置上的元素是有序的。

②希爾排序演算法的效率依賴於增量的選取

假設增量序列為 h(1),h(2).....h(k),其中h(1)必須為1,且h(1)第一趟排序時在增量為h(k)的各個元素上進行比較;

第二趟排序在增量為h(k-1)的各個元素上進行比較;

最後一趟在增量h(1)上進行比較。由此可以看出,每進行一趟排序,增量是乙個不斷減少的過程,因此稱之為縮小增量。

當增量減少到h(1)=1時,這裡完全就是插入排序了,而在此時,整個元素經過前面的 k-1 趟排序後,已經變得基本有序了,而我們知道,對於插入排序而言,當待排序的陣列基本有序時,插入排序的效率是非常高的。因此,希爾排序就是利用「增量」技巧將插入排序的平均時間複雜度o(n^2)降低為亞二次方。

二,希爾排序例項分析

假設原始陣列為: 81   94   11   96   12   35    增量序列為 h(1)=1  h(2)=3

這裡一共有兩個增量序列,故一共有兩趟排序。第一趟按照增量3來排序

處於增量3上的元素集合如下:<81      96>,<94      12>,<11      35>排序之後變成:<81      96>,<12      94>,<11      35>

即,陣列變成了:81

1211

969435

可以看出,在增量為3的各個位置上的元素都是有序的。

經過前面一趟排序,此時陣列已經基本有序,再使用增量為1的排序時(插入排序),比較的次數將會大大地降低。

第二趟按增量為h(1)=1 來排序,排序後陣列變成:

11   12   35   81   94   96

三,演算法實現

1

public

class shellsort

23 }

24 }

2526

//for test purpose

27public

static

void main(string args) ;

29 shellsort(arr);

30for (integer integer : arr)

33 }

34 }

①第10行for迴圈表示,一共有多少個增量。增量的序列的個數,就是希爾排序的趟數。

上面的增量序列為: arr.length/2 , arr.length/2/2, arr.length/2/2/2    ....   2,  1

②裡層的兩個for迴圈(第16行至23行)實際上是乙個插入排序

③第16行for迴圈表示:從陣列的第 arr.length/2 下標起,對各組增量序列上的元素進行插入排序。gap等於arr.length/2時的排序分析如下:

對於第一趟排序而言(gap等於arr.length/2),一共有多少組呢?答案是一共有 arr.length - arr.length/2 + 1 組。

即:arr[arr.length/2]   arr[0] 這兩個元素是一組

arr[arr.length/2 + 1]   arr[1] 這兩個元素是一組

arr[arr.length -1]   arr[arr.length-1-gap]這兩個元素是一組,此時gap等於arr.length/2

④第19行for迴圈,就是插入排序中的將當前元素與前面的元素進行比較。這裡的前面元素是相差 gap 個位置上的元素。

比如, arr[length/2]  與 arr[length/2-gap]進行比較。

四:參考資料

排序演算法總結之快速排序

排序演算法總結之歸併排序

排序演算法總結之堆排序

排序演算法總結之插入排序

各種排序演算法的總結

至此,五大基於記憶體的排序演算法:插入排序、希爾排序;歸併排序、快速排序;堆排序 全部已經實現了一遍。

插入排序和希爾排序是一類,本質上希爾排序就是插入排序。插入排序它的增量就是1,而希爾排序則按多個增量進行排序,增量逐漸減少至1

歸併排序和快速排序很像。之所以像,是因為它們都基於分治、遞迴。歸併排序每次將原陣列遞迴分成兩個大小相等的子陣列,而快速排序則是基於pivot元素將原陣列分成兩個子陣列。歸併排序不斷地分解原陣列,直到劃分的兩個子陣列中只存在乙個元素時,這時,這兩個子陣列可以視為都是有序的。從而,再合併兩個有序的子陣列,來實現排序。

堆排序,借助了二叉堆,邏輯上是一棵完全二叉樹,物理儲存結構是乙個一維陣列。通過不斷地刪除堆頂元素,來實現排序。

排序演算法之希爾排序

希爾排序實際上是一種分治思想的插入排序。插入排序不說了,不清楚看這裡 分治思想,對增量為dk,dk遞減,開始很多小序列,最後為乙個大序列 相對直接插入排序,在希爾排序中,只不過增量不是1,而是dk 較好的增量序列是2 k 1,2 k 1 1,7,3,1,這樣可使shell排序時間複雜度達到o n 1...

排序演算法之希爾排序

希爾排序 shell sort 又稱為縮小增量排序,輸入插入排序演算法,是對直接排序演算法的一種改進。本文介紹希爾排序演算法。對於插入排序演算法來說,如果原來的資料就是有序的,那麼資料就不需要移動,而插入排序演算法的效率主要消耗在資料的移動中。因此可知 如果資料的本身就是有序的或者本身基本有序,那麼...

排序演算法之希爾排序

希爾排序,突破了 通過交換相鄰元素進行排序的任何演算法平均需要 n 2 的二次時間限制 通過比較相距一定間隔的元素來工作。使用乙個增量序列 h1 1,h2,ht,在使用乙個 增量h的一趟排序後,對於每乙個i滿足pdata i pdata i h 即此時序列是h排序的 各趟 比較所用的距離逐漸減小,直...