簡簡單單學演算法 排序演算法一(希爾排序)

2021-08-11 02:48:49 字數 1340 閱讀 7915

希爾排序也是一種插入排序方法,實際上是一種分組插入方法。先取定乙個小於n的整數d1作為第乙個增量,把錶的全部記錄分成d1個組,所有距離為d1的倍數的記錄放在同乙個組中,在各組內進行直接插入排序;然後,取第二個增量d2(<d1),重複上述的分組和排序,直至所取的增量dt=1(dt

例如:將 n 個記錄分成 d 個子序列:   

…  這個是排序過程每次按增量分為一組,在組內排好序;理論說多了有點暈,來點實際例子:  

例如:資料未排序:[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

距離為5的資料分為一組,共5組[10,5],[9,4],[8,3],[7,2],[6,1] 

分組排序[5,10],[4,9],[3,8],[2,7],[1,6],將分組資料復原到陣列中

d=5:[5, 4, 3, 2, 1, 10, 9, 8, 7, 6]

距離為2的資料分為一組,共2組[5,3,1,9,7],[4,2,10,8,6]

排序為[1,3,5,7,9] [2,4,6,8,10],將分組資料復原到陣列中

d=2:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

d=1:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

直到增量遞減到1為止,增量大小視情況而定,分組排序時用的是插入演算法,當然也可以選用適用排序演算法。

我認為希爾排序是對插入排序的一種優化。

最好情況:由於希爾排序的好壞和步長d的選擇有很多關係,因此,目前還沒有得出最好的步長如何選擇(現在有些比較好的選擇了,但不確定是否是最好的)。所以,不知道最好的情況下的演算法時間複雜度。  

最壞情況下:o(n*logn),最壞的情況下和平均情況下差不多。  

平均情況下:o(n*logn)

由於多次插入排序,我們知道一次插入排序是穩定的,不會改變相同元素的相對順序,但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動,最後其穩定性就會被打亂,所以shell排序是不穩定的。(有個猜測,方便記憶:一般來說,若存在不相鄰元素間交換,則很可能是不穩定的排序。)

經過隨機資料多次測試結果如下:

插入演算法:1萬個隨機整數排序平均耗時0.1s

希爾演算法:1萬個隨機整數排序平均耗時0.025s

插入演算法:10萬個隨機整數排序平均耗時7.9s

希爾演算法:10萬個隨機整數排序平均耗時0.06s

可能每次產生的隨機數存在不確定性,但平均耗時可以看出希爾演算法優勢明顯;

public void sort (int array,int n)

}"d="+d+arrays.tostring(array));

d=d/2; /*增量遞減*/

} }

簡簡單單的遞推演算法

簡簡單單的遞推 1 什麼是遞推 遞推是按照一定的規律來計算序列中的每個項,通常是通過計算前面的一些項來得出序列 中的指定項的值。其思想是把乙個複雜的龐大的計算過程轉化為簡單過程的多次重複 該演算法利用了計算機速度快和不知疲倦的機器特點。遞推演算法是一種簡單的演算法,即通過已知條件,利用特定遞推關係得...

006 排序演算法 希爾排序

一 概述 希爾排序 shell s sort 是插入排序的一種又稱 縮小增量排序 diminishing increment sort 是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。該方法因d.l.shell於1959年提出而得名。排序方法 時間複雜度 平均 時間複雜度 最...

32 排序演算法(5) 希爾排序

直接插入排序演算法 straight insertion sort 適用於基本有序且記錄數少的陣列,但是這樣的要求已經算比較苛刻了。所以乙個直觀的改進方法是,對於乙個陣列,可以使它變得基本有序,再用用希爾排序改進直接插入排序就會得到比較好的結果,如下圖所示 初始的時候將間隔為 4 的元素通過直接插入...