日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

十大排序算法小结

發布時間:2024/9/30 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 十大排序算法小结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

相關博客:

排序算法:冒泡排序、插入排序、選擇排序、希爾排序

排序算法:歸并排序、快速排序

排序算法:桶排序、計數排序、基數排序

排序算法:堆排序


?

前面學習了10中最基本的排序算法,這篇博客主要是對這10種排序算法的小結:

1、這十種排序算法可以分為兩大類:

(1)非線性時間排序算法:通過比較來決定元素間的相對次序,由于其時間復雜度不能突破O(nlogn),因此稱為非線性時間比較類排序。這類算法包括:冒泡排序、插入排序、選擇排序、希爾排序、歸并排序、快速排序、堆排序。

(2)線性時間非比較類排序算法:不通過比較來決定元素間的相對次序,它可以突破基于比較排序的時間下界,以線性時間運行,因此稱為線性時間非比較類排序。 這類算法包括:桶排序、計數排序、基數排序。不過,雖然這幾種算法的時間復雜度比較低,但是他們對要排序的數據要求也比較苛刻。

2、復雜度分析:?

?排序方法最好時間復雜度最壞時間復雜度平均時間復雜度空間復雜度穩定性

非線性

時間排

序算法

冒泡排序O(n)O(n^2)O(n^2)O(1)穩定
插入排序O(n)O(n^2)O(n^2)O(1)穩定
選擇排序O(n^2)O(n^2)O(n^2)O(1)不穩定
希爾排序O(n)O(n^2)O(n^1.3)O(1)不穩定
歸并排序O(nlogn)O(nlogn)O(nlogn)O(n)穩定
快速排序O(nlogn)O(n^2)O(nlogn)O(1)不穩定
堆排序O(nlogn)O(nlogn)O(nlogn)O(1)不穩定

線性時間

排序算法

桶排序O(n)O(n^2)O(n)O(n+k)穩定
計數排序O(n+k)O(n+k)O(n+k)O(n+k)穩定
基數排序O(n*k)O(n*k)O(n*k)O(n+k)穩定
其中k為桶的數量

?

二、算法主要思想:

1、冒泡排序:

冒泡排序只會操作相鄰的兩個數據。每次冒泡操作都會對相鄰的兩個元素進行比較,看是否滿足大小關系的要求。如果不滿足就讓它倆互換位置。一次冒泡會讓至少一個元素移動到它應該在的位置,重復n次,就完成了n個數據的排序工作。

2、插入排序:

將數組的數據分為兩個區間,已排序區間和未排序區間。初始已排序區間只有一個元素,就是數組的第一個元素。算法的核心思想就是,取未排序區間中的元素,在已排序區間中找到合適的位置將其插入,并保證已排序區間的數據一直有序。重復這個過程,直到未排序區間中元素為空,算法結束。

3、選擇排序:

選擇排序的實現思路和插入排序類似,也分為已排序區間和未排序區間。但是選擇排序每次會從未排序區間中選擇最小(最大)的元素,存放已排序區間的末尾。重復此操作,直到所有元素排序完畢。

上面三種排序的時間復雜度都是O(n^2),比較高,適合小規模數據的排序。

4、希爾排序:

希爾排序是簡單插入排序的改進版。他與插入排序的不同之處在于,它會優先比較較遠的元素。希爾排序又叫縮小增量排序。希爾排序的核心在于間隔序列的設定(也就是增量)。既可以提前設定好間隔序列,也可以動態定義間隔序列。

5、歸并排序:

歸并排序的采用分治思想,如果要排序一個數組,我們先把數組從中間分成前后兩個部分,然后對前后兩個部分分別進行排序,再將排好序的兩部分合并在一起,這樣整個數組就都有序了。核心是merge()合并函數。

6、快速排序:

快速排序也是利用分治思想。如果要排序一組數據,我們先選擇這組數據中任意一個數據作為分區點pivot,然后遍歷這組數據,將小于分區點pivot的放到左邊,大于分區點pivot的放到右邊,將pivot放到中間。然后再分別對左右兩部分進行排序。核心是partition()函數。

7、堆排序:

堆排序是指利用堆這種數據結構進行排序的一種算法,堆排序分為建堆和排序兩大步驟。堆需要滿足一下兩個特性:

①堆是一種完全二叉樹,也就是除了最后一層,其他層的節點個數都是滿的,最后一個節點都靠左排列。所以可以使用數組來存儲堆中每個節點的值

②堆中每一個節點的值都必須大于等于(或小于等于)其左右子節點的值。

(1)首先對要排序的數據進行建堆。建堆結束后,數組中的數據已經是按照大頂堆的特性組織的。數組中的第一個元素就是堆頂(即最大值)。

(2)將堆頂元素a[1]與最后一個元素a[n]交換,這時,最大元素就放到了下標為n的位置。

(3)重新堆化:交換后新的堆頂可能違反堆的性質,需要重新進行堆化。

(4)重復(2)(3)操作,直到最后堆中只剩下下標為1的元素,排序就完成了。

8、桶排序:

桶排序的核心思想就是將要排序的數據分到幾個有序的桶里,每個桶里的數據再單獨進行排序。桶排序完之后,再把每個桶里的數據按照順序依次取出,組成的序列就是有序的了。

適用場景:首先,要排序的數據需要很容易就能劃分成m個桶,并且,桶與桶之間有著天然的大小順序。這樣每個桶內數據都排序完之后,桶與桶之間的數據不需要在進行排序。其次,數據在各個桶之間的分布比較均勻的。所以,桶排序比較適合用在外部排序中。所謂的外部排序就是數據存儲在外部磁盤中,數據量比較大,內存有限,無法將數據全部加載到內存中。

9、計數排序:

計數排序可以看成是桶排序的一種特殊情況,只是桶的大小粒度不一樣。當要排序的 n 個數據,所處的范圍并不大的時候,比如最大值是 k,我們就可以把數據劃分成 k 個桶。每個桶內的數據值都是相同的,省掉了桶內排序的時間。

適用場景:計數排序只能用在數據范圍不大的場景中,如果數據范圍 k 比要排序的數據 n 大很多,就不適合用計數排序了。而且,計數排序只能給非負整數排序,如果要排序的數據是其他類型的,要將其在不改變相對大小的情況下,轉化為非負整數。

10、基數排序:

基數排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次類推,直到最高位。基數排序對要排序的數據是有要求的,需要可以分割出獨立的“位”來比較,而且位之間有遞進的關系,如果 a 數據的高位比 b數據大,那剩下的低位就不用比較了。除此之外,每一位的數據范圍不能太大,因為基數要借助桶排序或者計數排序算法來排序,否則,基數排序的時間復雜度就無法做到 O(n) 了。

?

?

總結

以上是生活随笔為你收集整理的十大排序算法小结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。