演算法之排序演算法的演算法思想和使用場景總結

2022-09-29 19:48:11 字數 2712 閱讀 5719

1. 概述

排序演算法是計算機技術中最基本的演算法,許多複雜演算法都會用到排序。儘管各種排序演算法都已被封裝成庫函式供程式設計師使用,但了解排序演算法的思想和原理,對於編寫高質量的軟體,顯得非常重要。

本文介紹了常見的排序演算法,從演算法思想,複雜度和使用場景等方面做了總結。

2. 幾個概念

(1)排序穩定:如果兩個數相同,對他們進行的排序結果為他們的相對順序不變。例如a=這裡排序之後是a = 穩定就是排序後第乙個1就是排序前的第乙個1,第二個1就是排序前第二個1,第三個1就是排序前的第三個1。同理2也是一樣。不穩定就是他們的順序與開始順序不一致。

(2)原地排序:指不申請多餘的空間進行的排序,就是在原來的排序資料中比較www.cppcns.com和交換的排序。例如快速排序,堆排序等都是原地排序,合併排序,計數排序等不是原地排序。

總體上說,排序演算法有兩種設計思路,一種是基於比較,另一種不是基於比較。《演算法導論》一書給出了這樣乙個證明:「基於比較的演算法的最優時間複雜度是o(n lg n)」。對於基於比較的演算法,有三種設計思路,分別為:插入排序,交換排序和選擇排序。非基於比較的排序演算法時間複雜度為o(lg n),之所以複雜度如此低,是因為它們一般對排序資料有特殊要求。如計數排序要求資料範圍不會太大,基數排序要求資料可以分解成多個屬性等。

3. 基於比較的排序演算法

正如前一節介紹的,基於比較的排序演算法有三種設計思路,分別為插入,交換和選擇。對於插入排序,主要有直接插入排序,希爾排序;對於交換排序,主要有氣泡排序,快速排序;對於選擇排序,主要有簡單選擇排序,堆排序;其它排序:歸併排序。

3.1  插入排序

(1) 直接插入排序

特點:穩定排序,原地排序,時間複雜度o(n*n)

思想:將所有待排序資料分成兩個序列,乙個是有序序列s,另乙個是待排序序列u,初始時,s為空,u為所有資料組成的數列,然後依次將u中的資料插到有序序列s中,直到u變為空。

適用場景:當資料已經基本有序時,採用插入排序可以明顯減少資料交換和資料移動次數,進而提公升排序效率。

(2)希爾排序

特點:非穩定排序,原地排序,時間複雜度o(n^lamda)(1 < lamda < 2), lamda和每次步長選擇有關。

思想:增量縮小排序。先將序列按增量劃分為元素個數近似的若干組,使用直接插入排序法對每組進行排序,然後不斷縮小增量直至為1,最後使用直接插入排序完成排序。

適用場景:因為增量初始值不容易選擇,所以該演算法不常用。

3.2  交換排序

(1)氣泡排序

特點:穩定排序,原地排序,時間複雜度o(n*n)

思想:將整個序列分為無序和有序兩個子序iocbkqelfw列,不斷通過交換較大元素至無序子串行首完成排序。

適用場景:同直接插入排序類似

(2)快速排序

特點:不穩定排序,原地排序,時間複雜度o(n*lg n)

思想:不斷尋找乙個序列的樞軸點,然後分別把小於和大於樞軸點的資料移到樞軸點兩邊,然後在兩邊數列中繼續這樣的操作,直至全部序列排序完成。

適用場景:應用很廣泛,差不多各種語言均提供了快排api

3.3  選擇排序

(1)簡單選擇排序

特點:不穩定排序(比如對3 3 2三個數進行排序,第乙個3會與2交換),原地排序,時間複雜度o(n*n)

思想:將序列劃分為無序和有序兩個子串行,尋找無序序列中的最小(大)值和無序序列的首元素交換,有序區擴大乙個,迴圈下去,最終完成全部排序。

適用場景:交換少

(2) 堆排序

特點:非穩定排序,原地排序,時間複雜度o(n*lg n)

思想:小頂堆或者大頂堆

適用場景:不www.cppcns.com如快排廣泛

3.4  其它排序

(1) 歸併排序

特點:穩定排序,非原地排序,時間複雜度o(n*n)

思想:首先,將整個序列(共n個元素)看成n個有序子串行,然後依次合併相鄰的兩個子串行,這樣一直下去,直至變成乙個整體有序的序列。

適用場景:外部排序

4. 非基於比較的排序演算法

非基於比較的排序演算法主要有三種,分別為:基數排序,桶排序和計數排序。這些演算法均是針對特殊資料的,不如要求資料分布均勻,資料偏差不會太大。採用的思想均是記憶體換時間,因而全是非原地排序。

4.1 基數排序

特點:穩定排序,非原地排序,時間複雜度o(n)

思想:把每個資料看成d個屬性組成,依次按照d個屬性對資料排序(每輪排序可採用計數排序),複雜度為o(d*n)

適用場景:資料明顯有幾個關鍵字或者幾個屬性組成

4.2  桶排序

特點:穩定排序,非原地排序,時間複雜度o(n)

思想:將資料按大小分到若干個桶(比如鍊錶)裡面,每個桶內部採用簡單排序演算法進行排序。

適用場景:0

4.3  計數排序

特點:穩定排序,非原地排序,時間複雜度o(n)

思想:對每個資料出現次數進行技術(用hash方法計數,最簡單的hash是陣列!),然後從大到小或者從小到大輸出每個資料。

使用場景:比基數排序和桶排序廣泛得多。

5.  總結

對於基於比較的排序演算法,大部分簡單排序(直接插入排序,選擇排序和氣泡排序)都是穩定排序,選擇排序除外;大部分高階排序(除簡單排序以外的)都是不穩定排序,歸併排序除外,但iocbkqelfw歸併排序需要額外的儲存空間。對於非基於比較的排序演算法,它們都對資料規律有特殊要求 ,且採用了記憶體換時間的思想。排序演算法如此之多,往往需要根據實際應用選擇最適合的排序演算法。

本文標題: 演算法之排序演算法的演算法思想和使用場景總結

本文位址: /ruanjian/c/112881.html

分治思想之排序演算法

分而治之是設計高效演算法的乙個重要思想。本文主要總結一下分治思想在排序演算法中的運用。排序在商業資料處理和現代科學計算中有著重要的地位,它能夠應用於事物處理 組合優化 天體物理學 分子動力學 語言學 基因組學 天氣預報和很多其它領域。演算法 發展至今,已經出現過很多的排序演算法。如選擇排序,插入排序...

演算法思想 排序

排序並不是一種演算法思想,而是基於遍歷的一種演算法實現。形形色色的排序演算法,並不能絕對的認為哪一種排序最好,因為最好的度量指標究竟是耗時 記憶體占用亦或是穩定性是不確定的,這個要根據使用場景來決定,但是我們必須掌握各種排序方法的實現原理,這樣才能做到 具體問題具體分析 下圖為多種排序演算法的特性歸...

排序演算法思想記錄 快速排序演算法

思路 選取陣列中任意乙個數字作為對比位pivot,然後定義兩個指標位left right,分別從陣列開始和結束位置向內掃瞄,每次先動乙個指標位,如right遇到小於pivot的值,將該值存放到左指標處,接著左指標向內位移,遇到大於pivot的值存放至右指標處,依次迴圈到left與right重合,則完...