排序算法 & 分析
- 排序算法歷史
- 排序算法分析
- 很快的排序
- 較快的排序
- 中等的排序
- 很慢的排序
- 分析的結果
- 0.沒有要求
- 1.對速度有要求
- 2.邊排序邊操作
- 3.條件1&條件2
- 4.在有序數中操作
- 5.條件1&條件4
了解各種排序,詳見排序專欄
排序算法歷史
縱觀排序算法的歷史,有哪些排序算法的速度可以到達 O ( n l o g ( n ) ) O(n~log(n)) O(n?log(n))?
-
冒泡排序( B u b b l e Bubble Bubble S o r t Sort Sort):冒泡排序是最簡單的排序算法之一。它通過多次比較和交換相鄰元素的方式,將最大(或最小)的元素逐漸“冒泡”到數組的一端。盡管冒泡排序的時間復雜度為 O ( n 2 ) O(n^2) O(n2),效率較低,但它易于理解和實現。
-
選擇排序( S e l e c t i o n Selection Selection S o r t Sort Sort):選擇排序是一種簡單直觀的排序算法。它通過每次選擇未排序部分的最小(或最大)元素,并將其放置在已排序部分的末尾,逐漸構建有序序列。選擇排序的時間復雜度也為 O ( n 2 ) O(n^2) O(n2),但相比冒泡排序,它的交換次數較少。
-
插入排序( I n s e r t i o n Insertion Insertion S o r t Sort Sort):插入排序是一種穩定的排序算法。它通過將未排序部分的元素逐個插入已排序部分的適當位置,來構建有序序列。插入排序的時間復雜度為 O ( n 2 ) O(n^2) O(n2),但對于小規模或基本有序的數組,插入排序的性能較好。
-
希爾排序( S h e l l Shell Shell S o r t Sort Sort):希爾排序是插入排序的一種改進版本。它通過將數組分割成多個較小的子序列,并對子序列進行插入排序,最后再對整個數組進行一次插入排序。希爾排序的時間復雜度介于 O ( n ) O(n) O(n)和 O ( n 2 ) O(n^2) O(n2)之間,取決于所選的間隔序列。
-
歸并排序( M e r g e Merge Merge S o r t Sort Sort):歸并排序是一種分治算法。它將數組遞歸地分成兩個子數組,分別進行排序,然后將兩個有序子數組合并成一個有序數組。歸并排序的時間復雜度為 O ( n l o g ( n ) ) O(n~log(n)) O(n?log(n)),它是一種穩定的排序算法。
-
快速排序( Q u i c k Quick Quick S o r t Sort Sort):快速排序也是一種分治算法。它通過選擇一個基準元素,將數組分成兩個子數組,其中一個子數組的所有元素都小于基準元素,另一個子數組的所有元素都大于基準元素。然后遞歸地對兩個子數組進行排序。快速排序的時間復雜度為 O ( n l o g ( n ) ) O(n~log(n)) O(n?log(n)),但在最壞情況下可能達到 O ( n 2 ) O(n^2) O(n2)。
-
堆排序( H e a p Heap Heap S o r t Sort Sort):堆排序利用堆這種數據結構進行排序。它通過構建最大堆(或最小堆),將堆頂元素與最后一個元素交換,并對剩余元素重新調整堆,重復這個過程直到整個數組有序。堆排序的時間復雜度為 O ( n l o g ( n ) ) O(n~log(n)) O(n?log(n)),它是一種不穩定的排序算法。
-
計數排序(這個不能算排序吧~)( C o u n t i n g Counting Counting S o r t Sort Sort):計數排序是一種非比較排序算法。它通過確定每個元素在排序后的序列中的位置,來實現排序。計數排序的時間復雜度為 O ( n + k ) O(n+k) O(n+k),其中k是待排序數組中的最大值。計數排序適用于元素范圍較小的情況。
-
桶排序( B u c k e t Bucket Bucket S o r t Sort Sort):桶排序也是一種非比較排序算法。它將待排序元素分到不同的桶中,對每個桶中的元素進行排序,然后按照桶的順序將元素合并起來。桶排序的時間復雜度取決于桶的數量和每個桶內使用的排序算法。
-
基數排序( R a d i x Radix Radix S o r t Sort Sort):基數排序是一種非比較排序算法。它根據元素的位數,將待排序元素按照位數從低到高進行排序。基數排序可以使用穩定的排序算法作為每個位數的排序算法,如計數排序或桶排序。
排序算法分析
很快的排序
我們發現,很快的排序,例如:桶排序和基數排序,它們的代碼都比較復雜,一般能不用就不用。
較快的排序
而較快的排序,例如:歸并排序和堆排序(之所以不放快排 是因為快排實在是太不穩定了!!!),它們的代碼也比較復雜(優先隊列當我沒說),如果使用優先隊列有不方便訪問,因此能不用就不用。
注:有時優先隊列是很方便的。
中等的排序
中等的排序,如:希爾排序和快速排序,有時速度無法滿足要求,并且代碼也屬于復雜的范疇。
很慢的排序
很慢的排序,如:冒泡排序和選擇排序,雖然代碼簡短好記,但是速度實在是太慢了!!!!!!
分析的結果
0.沒有要求
如果沒有特殊要求的話,用優先隊列進行堆排是不錯的選擇,另外還可以用 s o r t sort sort函數排序
1.對速度有要求
如果對速度有要求的話,建議用優先隊列進行堆排,也可以用 s o r t sort sort函數排序。
說了跟沒說一樣
2.邊排序邊操作
如果要在排序中操作,建議使用各種較慢的排序算法,這樣方便理解以及更改。
3.條件1&條件2
這樣的話就最好用歸并排序了!!這是一種優秀的排序算法,并且穩定,可以在大部分情況下使用
4.在有序數中操作
這樣建議使用插入排序,因為插入排序本身就是維護一個有序數列,這樣的話方便快捷!
5.條件1&條件4
插入排序優化——超越歸并排序的超級算法!!
詳見我的神奇博客:史上最快的插入排序