1、冒泡排序不管序列是怎樣,都是要比較n(n-1)/2 次的,最好、最壞、平均時間復雜度都為O(n²),需要一個臨時變量用來交換數組內數據位置,所以空間復雜度為O(1)。
2、選擇排序是冒泡排序的改進,同樣選擇排序無論序列是怎樣的都是要比較n(n-1)/2次的,最好、最壞、平均時間復雜度也都為O(n²),需要一個臨時變量用來交換數組內數據位置,所以空間復雜度為O(1)。
3、插入排序不同,如果序列是完全有序的,插入排序只要比較n次,無需移動時間復雜度為O(n),如果序列是逆序的,插入排序要比較O(n²)和移動O(n²) ,所以平均復雜度為O(n²),最好為O(n),最壞為O(n²),排序過程中只要一個輔助空間,所以空間復雜度O(1)。
4、快速排序的時間復雜度最好是O(nlogn),平均也是O(nlogn),最壞情況是序列本來就是有序的,此時時間復雜度為O(n²),快速排序的空間復雜度可以理解為遞歸的深度,而遞歸的實現依靠棧,平均需要遞歸logn次,所以平均空間復雜度為O(logn)。
5、歸並排序需要一個臨時temp[]來儲存歸並的結果,空間復雜度為O(n),時間復雜度為O(nlogn),可以將空間復雜度由 O(n) 降低至 O(1),然而相對的時間復雜度則由 O(nlogn) 升至 O(n²)。
6、希爾排序的時間復雜度分析及其復雜,有的增量序列的復雜度至今還沒人能夠證明出來,只需要記住結論就行,{1,2,4,8,...}這種序列並不是很好的增量序列,使用這個增量序列的時間復雜度(最壞情形)是O(n²),Hibbard提出了另一個增量序列{1,3,7,...,2^k-1},這種序列的時間復雜度(最壞情形)為O(n^1.5),Sedgewick提出了幾種增量序列,其最壞情形運行時間為O(n^1.3),其中最好的一個序列是{1,5,19,41,109,...},需要一個臨時變量用來交換數組內數據位置,所以空間復雜度為O(1)。
7、堆排序的時間復雜度,主要在初始化堆過程和每次選取最大數后重新建堆的過程,初始化建堆時的時間復雜度為O(n),更改堆元素后重建堆的時間復雜度為O(nlogn),所以堆排序的平均、最好、最壞時間復雜度都為O(nlogn),堆排序是就地排序,空間復雜度為常數O(1)。
8、基數排序對於 n 個記錄,執行一次分配和收集的時間為O(n+r),如果關鍵字有 d 位,則要執行 d 遍,所以總的時間復雜度為 O(d(n+r))。該算法的空間復雜度就是在分配元素時,使用的桶空間,空間復雜度為O(r+n)=O(n)
排序算法適用場景
- 若n較小(如n≤50),可采用直接插入或直接選擇排序。當記錄規模較小時,直接插入排序較好,否則因為直接選擇移動的記錄數少於直接插人,應選直接選擇排序為宜。
- 若序列初始狀態基本有序,則直接插入和冒泡最佳,隨機的快速排序也不錯。插入排序對部分有序的數組很有效,所需的比較次數平均只有選擇排序的一半。
- 若n較大,則應采用時間復雜度為O(nlgn)的排序方法:快速排序、堆排序或歸並排序。
- 快速排序是目前基於比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分布時,快速排序的平均時間最短;
- 堆排序所需的輔助空間少於快速排序,並且不會出現快速排序可能出現的最壞情況。但這兩種排序都是不穩定的。
- 若要求排序穩定,則可選用歸並排序。兩兩歸並的排序算法並不值得提倡,通常可以將它和直接插入排序結合在一起使用。先利用直接插入排序求得較長的有序子文件,然后再兩兩歸並之。因為直接插入排序是穩定的,所以改進后的歸並排序仍是穩定的。
- 希爾排序比插入排序和選擇排序要快得多,並且數組越大,優勢越大。如果需要解決一個排序問題而又沒有系統排序函數可用(例如直接接觸硬件或者運行於嵌入式系統中的代碼),可以先用希爾排序,再考慮是否替換為更復雜的排序算法。而對於部分有序和小規模的數組,應使用插入排序。
- 歸並排序可以處理數百萬甚至更大規模的數組,但是插入排序和選擇排序做不到。歸並排序的主要缺點是輔助數組所使用的額外空間和n的大小成正比。
- 快速排序的優點是原地排序(只需要一個很小的輔助棧),但是基准的選取是個問題,對於小數組,快速排序要比插入排序慢。
- 堆排序的優點是在排序時可以將需要排序的數組本身作為堆,無需任何額外空間,與選擇排序有些類似,但所需的比較要少得多,堆排序適合例如嵌入式系統或低成本移動設備中容量有限的場景。
- 來自https://www.nowcoder.com/discuss/200097?type=0&order=0&pos=160&page=1