一,希爾排序演算法介紹
①希爾排序又稱縮小增量排序 ,它本質上是乙個插入排序演算法。為什麼呢?
因為,對於插入排序而言,插入排序是將當前待排序的元素與前面所有的元素比較,而希爾排序是將當前元素與前面增量位置上的元素進行比較,然後,再將該元素插入到合適位置。當一趟希爾排序完成後,處於增量位置上的元素是有序的。
②希爾排序演算法的效率依賴於增量的選取
假設增量序列為 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①第10行for迴圈表示,一共有多少個增量。增量的序列的個數,就是希爾排序的趟數。public
class shellsort
23 }
24 }
2526
//for test purpose
27public
static
void main(string args) ;
29 shellsort(arr);
30for (integer integer : arr)
33 }
34 }
上面的增量序列為: 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排序的 各趟 比較所用的距離逐漸減小,直...