動畫 什麼是希爾排序?

2021-10-01 12:51:39 字數 2582 閱讀 2040

上篇寫的直接插入排序演算法時間複雜度是o(n^2),如果要令此排序演算法的時間複雜度要低於o(n^2),必須是「遠距離的元素交換」使得這組元素能提高有序的程度,然後進行直接插入排序的時候可以減少交換的工作量。

那通過什麼減少交換的工作量呢?希爾排序可以解決這個問題。

希爾排序在做直接插入排序之前,希望可以對原整個待排序列進行預處理,目的是為了最後一步直接插入排序的時候可以減少交換次數,同時也減少時間上的消耗。

假定陣列初始狀態:5,1,9,3,7,4,8,6,2

然後設定初始增量是gap = length / 2 = 9 / 2 = 4,意味著兩個元素之間比較和交換的距離都是4(隔著3個元素),然後也會被分成4組,【5,7,2】,【1,4】,【9,8】,【3,6】。

對4組進行完排序的時候接著逐步縮小增量,gap = 4 / 2 = 2,說明兩個元素待會比較和交換的距離都是2,被分為兩組,對著兩組也進行排序。

最後增量縮小為1,這時候就是純正的直接插入排序了,因為在前面進行了預處理,使得這整個序列進行了「粗略調整」,在做最後一步的直接插入排序的時候,如果待排序列明顯有序的話,就真正減少了交換的次數,也真正減少了時間上的消耗。

初始狀態 [5, 1, 9, 3, 7, 4, 8, 6, 2]

4增量交換 [5, 1, 8, 3, 7, 4, 9, 6, 2]

交換 [5, 1, 8, 3, 2, 4, 9, 6, 7]

交換 [2, 1, 8, 3, 5, 4, 9, 6, 7]

2增量交換 [2, 1, 5, 3, 8, 4, 9, 6, 7]

交換 [2, 1, 5, 3, 8, 4, 7, 6, 9]

交換 [2, 1, 5, 3, 7, 4, 8, 6, 9]

1增量交換 [1, 2, 5, 3, 7, 4, 8, 6, 9]

交換 [1, 2, 3, 5, 7, 4, 8, 6, 9]

交換 [1, 2, 3, 5, 4, 7, 8, 6, 9]

交換 [1, 2, 3, 4, 5, 7, 8, 6, 9]

交換 [1, 2, 3, 4, 5, 7, 6, 8, 9]

交換 [1, 2, 3, 4, 5, 6, 7, 8, 9]

我們為了減少交換的次數,也可以繼續優化,採用移動法的方式也可以減少交換的時間消耗。

初始狀態 [5, 1, 9, 3, 7, 4, 8, 6, 2]

4增量移動 [5, 1, 9, 3, 7, 4, 9, 6, 2]

移動 [5, 1, 8, 3, 7, 4, 9, 6, 7]

移動 [5, 1, 8, 3, 5, 4, 9, 6, 7]

2增量移動 [2, 1, 8, 3, 8, 4, 9, 6, 7]

移動 [2, 1, 5, 3, 8, 4, 9, 6, 9]

移動 [2, 1, 5, 3, 8, 4, 8, 6, 9]

1增量移動 [2, 2, 5, 3, 7, 4, 8, 6, 9]

移動 [1, 2, 5, 5, 7, 4, 8, 6, 9]

移動 [1, 2, 3, 5, 7, 7, 8, 6, 9]

移動 [1, 2, 3, 5, 5, 7, 8, 6, 9]

移動 [1, 2, 3, 4, 5, 7, 8, 8, 9]

移動 [1, 2, 3, 4, 5, 7, 7, 8, 9]

上面的過程使用的被稱為希爾排序的增量,是逐步折半縮小增量的過程。shell增量序列的遞推公式為:

shell增量序列的最壞時間複雜度為 o(n^2)。

希爾排序的增量序列的選擇有很多種,關於那些增量序列的選擇證明和過程比較複雜,就不糾結了。本文即將給出兩個案例,它們都可能比shell增量序列要好:hibbard增量序列和sedgewick增量序列。

hibbard增量序列的通項公式為:

hibbard增量序列的遞推公式為:

hibbard 增量序列的最壞時間複雜度為 o(n^(3/2));平均時間複雜度約為 o(n^(5/4))。

得到的,是比length小的最大初始增量。然後在下面**中只修改獲取初始增量的一步就好了,縮減方式和希爾增量一樣的,不做修改。

sedgewick增量序列的通項公式為:

sedgewick 增量序列的最壞時間複雜度為 o(n^(4/3));平均時間複雜度約為 o(n^(7/6))。

初次看這段公式的時候突然有點看不懂了,仔細看看原來是中間還有個小逗號,意思是這兩個增量序列的並查集,拿到比length小的最大值(初始增量)就可以了。

這過程有點複雜,因為存在兩段公式的關係,不能直接求得初始增量就可以了,還要考慮到縮小增量的下乙個數應該用哪個公式。採用的方式建立動態陣列,在while(增量上面解釋一下「<<」的運算子,它是轉化成二進位制然後左移幾位的演算法,例如9<<1,9轉化成二進位制1001,然後左移一位,後面補零得10010,轉化為十進位制就是18,相當於9*2=18。

再例如7<<2,7轉化為二進位制111,左移兩位成11100,轉化為十進位制就是32,相當於7*(2^2)=32。

」>>」運算子也是同樣的,相當於除以2的幾次方。

下面**獲取初始增量的也要修改,增量縮減方式也要相應的修改,然後其它的**不變。

本文介紹了希爾排序的基本思想、優化以及**的實現,包括後面兩個增量序列的選擇。增列序列的選擇方式對希爾排序也很重要,直接影響到希爾排序的效能。

動畫 什麼是希爾排序?

上篇寫的直接插入排序演算法時間複雜度是o n 2 如果要令此排序演算法的時間複雜度要低於o n 2 必須是 遠距離的元素交換 使得這組元素能提高有序的程度,然後進行直接插入排序的時候可以減少交換的工作量。那通過什麼減少交換的工作量呢?希爾排序可以解決這個問題。希爾排序在做直接插入排序之前,希望可以對...

動畫 什麼是氣泡排序?

冒牌排序演算法時間複雜度最壞的情況是,最好的,說明氣泡排序是可以優化的,就看你有沒有去發現。比較相鄰的元素,判斷是否符合要求,如果不符合就交換位置來達到排序的目的。對每一對相鄰元素做相同的工作,從開始第一對到結尾的最後一對,一次遍歷之後,最後乙個元素是最大 小 的數。第二次遍歷重複以上操作,因為最後...

動畫 什麼是桶排序?

桶排序和計數排序一樣,不受o nlogn 時間複雜度下限的影響,它將待排序序列通過遍歷方式分到有限數量的桶中,然後每個桶被單獨地排序,不管是使用同乙個比較類排序演算法或者使用不同的排序演算法,或者還是遞迴地使用桶排序。桶排序可以通過比較方式實現,也可以通過非比較方式實現。通過比較方式的桶排序分為4步...