排序演算法 插入排序與希爾排序

2021-08-21 18:53:39 字數 1801 閱讀 2006

最近一直在看《演算法》,正好複習到了排序這部分,就都總結一下。

插入排序

插入排序和選擇排序都屬於非常簡單而且容易理解的排序演算法。插入排序就像我們平時玩的紙牌,在排順序的時候,會按照順序一張一張插入。在乙個亂序陣列中,同樣如此,我們會在遍歷中,將資料按照公升序或降序方式向之前已經排列好的資料中進行插入。插入排序優勢在於對於乙個大部分資料已經有序,只有少數無序資料分布其中的模型有著很好的效能。但同樣,插入排序並不適合大規模陣列排序,因為其內部遍歷是對資料挪動是一位一位移動,假如有乙個非常大的陣列,恰巧最小的資料在最後幾位,這樣一位一位移動將是非常低效方式。

結論

對於隨機排列長度為n且主鍵不重複的陣列,平均情況下插入排序需要n²/4次比較和n²/4交換,最壞的情況下需要n²/2次比較和n²/2次交換。最好的情況下需要n-1次比較和0次交換。

下面是**實現

package sort;

public class insertsort

}} }

}

插入排序原理簡單易懂,就不進行過多闡述,下面主要來看下希爾排序。

希爾排序

希爾排序是首批突破時間複雜度為平方級的演算法,在排序演算法進化史中占有非常重要的地位。但同樣遺憾的是,後來經過證明,其時間複雜度為亞平方級,所以其效能與之後出現的歸併排序,快速排序等演算法仍有較大差距。

希爾排序我們可以簡單理解為加強的插入排序,其思想和插入排序有很大相思的程度,其主要應對情況便是之前我們提出的在乙個無序陣列中,最小的資料在陣列最末端,應用插入排序時,我們需要一位一位交換,這個數值如果是陣列長度,那麼將是非常高昂的消費。針對這種情況,希爾排序提出了一種新的解決辦法,我們可以設定乙個增量。我們用h來表示該增量。首先我們將陣列內間隔為h的資料進行排序,保證間隔為h的資料有序,通過這樣處理後,資料實際上就成為了h個有序陣列的組合,通過將h縮小,我們遍能進行更加精細化的排序,當h=1時,排序完成。通過這種方法,我們開始便能將位置太過靠後的資料大幅度向前移動,減小花費。

希爾排序更加高效的原因在於它權衡了陣列的規模和有序性。排序初,各個陣列都很短,排序後陣列都是部分有序,這兩種情況很適合插入排序。自陣列部分有序的成都取決於遞增序列的選擇。

下面我們結合**來具體分析。

package sort;

public class shellsort

// 迴圈

while (n >= 1)

n = n / 3;

}} }

}

由**可以看到,我們最開始取得的增量n為輸入陣列的長度三分之一,有人會問,這個值是怎麼來的。實際上,關於增量如何取值,不同的人有著不同的說法,有按照8,5,3,2,1進行增量取值,也有按照陣列長度不斷與乙個常數進行相乘取值。至於我選擇的陣列長度的三分之一,因為經過多次時間測試,相對來說比較穩定,在各方面都不具備短板的乙個值。

當我們將相差為n的陣列進行排序後,再將n/3進行排序,這樣每輪排序實際上將事大部分資料變的有序,這樣的模型非常適合插入排序進行計算。

希爾排序同樣適合大型陣列。它對任意排序陣列表現都很好,何況它不需要開闢額外的記憶體空間。而且,陣列越大,希爾排序的優勢將越加明顯。對於越大的n,有些快速排序的方法也許只能筆希爾排序快兩倍,而且更加複雜。我們可以在排序時先使用希爾排序,再進行優化,考慮更加複雜的排序演算法。

排序演算法 插入排序 希爾排序

1 相鄰資料之間相比較。先是1,0 然後2,1 1,0 以此類推 總結 大for從1 n 小for從i 0,之後判斷交換即可 public void charusort for int i 1 i a.length i 2 希爾排序是插入排序特殊化,他不再比相鄰資料,而是可以比較類似1,4,13.的...

插入排序演算法 希爾排序

插入排序演算法 希爾排序 希爾排序思想是將陣列每次分成不同的陣列同時進行排序,劃分的方式是設定增量值,即h length 2,h 2 與直接排序最大的不同就是比較的陣列值下標間隔不同。希爾排序在資料量龐大的時候進行排序效率高,時間短。觀察下圖,根據以上思想,進行移動。如下 include void ...

插入排序與希爾排序

插入排序是一種非常古老的排序思想,他的過程可以被形象的模擬出來 假設乙個人要摸起一副被打亂的撲克牌,我們注意到,剛開始時這個人手上並沒有牌,並且他每次只從牌堆中摸出一張牌,每當摸上一張牌時,他選擇從右向左 即從大到小 將這張牌與手中原有的牌進行比較,並最終將其插入到自己手牌中適合的位置,當牌堆中的牌...