数据结构与算法 / 排序算法(1)
零、前言
1、常用的排序算法總結
| 排序算法種類 | 時間復雜度 | 是否基于比較 |
| 冒泡、插入、選擇 | O(n^2) | √ |
| 快排、歸并 | O(nlogn) | √ |
| 桶、計數、基數 | O(n) | × |
2、算法的內存消耗 - 原地排序
? ? ? ? 指的是空間復雜度是 O(1) 排序算法。
4、算法的穩定性
? ? ? ? 原來序列中相等的元素,經過排序之后,相等元素之間原有的先后順序不變。
一、冒泡排序
1、原地排序?
? ? ? ?屬于原地排序算法。冒泡排序僅僅數據交換用到了交換操作,只需常量級的臨時空間,空間復雜度為O(1)。
2、穩定性排序?
? ? ? 屬于穩定排序算法。為了實現穩定排序,只需要保證在比較時發現相等時不交換數據即可,故。
3、時間復雜度
(1)最好的情況
? ? ? ?待排序的數據已有序,則只需進行一次冒泡排序即可,時間復雜度為 O(1) 。
(2)最壞的情況
? ? ? ?待排序的數據是倒序,則需要 n 次冒泡排序,時間復雜度為 O(n^2) 。具體的計算公式看下面網址:https://blog.csdn.net/itworld123/article/details/90766948
(3)平均時間復雜度
? ? ? ?對于最好的情況,需要交換 0 次,針對最壞的情況,需要交換 n(n-1)/2,因為數據排布具有隨機性,故交換次數的平均值為 n(n-1)/4,時間復雜度依然為 O(n^2) 。
二、插入排序
1、原理
? ? ? ?將待排序的數列分成兩組,分別是已排序部分和未排序部分。排序的過程就是將未排序中的數據逐一與已排序的數據進行比較,將該數據插入到已排序的數列中。
2、原地排序?
? ? ? ?屬于原地排序算法。根據代碼,插入排序過程中不需要額外的空間,空間復雜度為 O(1) 。
3、穩定性排序?
? ? ? ?屬于穩定排序算法。為了實現穩定性排序,可以將后面數據插入到前面與之相同的數據的后面即可。
4、時間復雜度
(1)最好的情況
? ? ? ?待排序的數據已有序,每個元素進行一次比較即可,時間復雜度為 O(1) 。
(2)最壞的情況
? ? ? ?待排序的數據是倒序,則:
? ? ? ?? ? ? ?第 2 個數據和第 1 個數據比較,比較 1 次;
? ? ? ?? ? ? ?第 3 個數據和第1、2個數據比較,比較 2 次;
? ? ? ?? ? ? ?第 4 個數據和第1、2、3個數據比較,比較 3?次;
? ? ? ?? ? ? ?? ? ? ?? ? ? ?……? ? ? ?? ? ? ?……
? ? ? ?? ? ? ?第 n 個數據和第1、2、3、……、(n-1)?個數據比較,比較 (n-1) 次;
? ? ? ?比較次數和為 n(n-1)/2,時間復雜度為 O(n^2) 。
(3)平均時間復雜度
? ? ? ?由于數據排布具有隨機性,故平均時間復雜度為?O(n^2) 。
三、選擇排序
1、原理
? ? ? ?和插入排序類似,也是將數列分成了已排序部分和未排序部分,但是選擇排序算法是從未排序部分選擇最小值和當前數據進行交換。
2、原地排序?
? ? ? ?屬于原地排序算法。根據代碼,選擇排序過程中不需要額外的空間,空間復雜度為 O(1) 。
3、穩定性排序?
? ? ? ?不屬于穩定排序算法。因為存在大量的交換,容易導致在交換過程中相同的兩個數據前后位置發生變化。
? ? ? ?栗子:5、8、5、2、9
? ? ? ?? ? ? ?比較時,“5”和“2”會調換位置,那么兩個“5”的原來的位置就顛倒了。
4、時間復雜度
(1)最好的情況
? ? ? ?待排序的數據已有序,每個元素進行一次比較即可,時間復雜度為 O(1) 。
(2)最壞的情況
? ? ? ?待排序的數據是倒序,則:
? ? ? ?? ? ? ?第 1?個數據和第 2、3、……、n?個數據比較,比較 (n-1)?次;
? ? ? ?? ? ? ?第 2?個數據和第 3、4、……、n 個數據比較,比較 (n-2) 次;
? ? ? ?? ? ? ?第 3?個數據和第 4、5、……、n 個數據比較,比較 (n-3)?次;
? ? ? ?? ? ? ?? ? ? ?? ? ? ?……? ? ? ?? ? ? ?……
? ? ? ?? ? ? ?第 (n-1) 個數據和第 n?個數據比較,比較 1?次;
? ? ? ?比較次數和為 n(n-1)/2,時間復雜度為 O(n^2) 。
(3)平均時間復雜度
? ? ? ?由于數據排布具有隨機性,故平均時間復雜度為?O(n^2) 。
四、插入比冒泡更受歡迎的原因
? ? ? ?因為冒泡排序中每次交換需要 3 條賦值語句,而插入排序則僅僅需要1次。
#define SWAP(x, y) \do \{ \(x) ^= (y); \(y) ^= (x); \(x) ^= (y); \} while (false)五、總結
1、性質
| 算法種類 | 時間復雜度 | 空間復雜度 | 原地排序 | 穩定排序 |
| 冒泡排序 | O(n^2) | O(1) | √ | √ |
| 插入排序 | O(n^2) | O(1) | √ | √ |
| 選擇排序 | O(n^2) | O(1) | √ | × |
2、源代碼
Github
?
(SAW:Game Over!)
總結
以上是生活随笔為你收集整理的数据结构与算法 / 排序算法(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构与算法 / 哈希算法
- 下一篇: Cpp 对象模型探索 / 对象的虚函数表