1. 程式人生 > >各類排序演算法比較和應用場景

各類排序演算法比較和應用場景

簡介

插入排序

插入排序是一種較為簡單的排序演算法,它的基本思想是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入。
形象的可以理解為打撲克抓拍的過程,通常我們右手抓牌,沒抓一張牌,就放到左手,抓下一張牌後,會把這張牌依次與左手上的牌比較,並把它插入到一個合適的位置(按牌面大小)。

希爾排序

希爾排序是對直接插入排序的一種優化,實質就是把直接插入排序改為了分組插入排序。其基本思想就是將整個待排序元素序列按gap(步長)分割為N個組,對每個組進行直接插入排序,然後在減小gap(步長)再進行直接插入排序,直到gap達到最小時,即陣列基本達到有序時,再對陣列進行直接插入排序,此時直接插入排序就可以達到最高效率。

選擇排序

選擇排序的排序思想就和它的名字一樣,每次通過從無序的陣列中選擇出一個最小的(要求升序排列)數把他放到陣列的最前面。再依次找次小的數字放到陣列無序區的最前。直到陣列為有序。

堆排序

堆排序(使用大堆,升序)從基本實現原理來說也是一種選擇排序,它同樣是確定了位置選擇符合位置的元素,但是堆排序是更加優化的選擇排序的版本,它利用了堆的特性。父結點的值大於子結點,且滿足完全二叉樹,大大提高了選擇排序的效率。

氣泡排序

氣泡排序(這裡指升序)是一種非常簡單直觀的排序方式,它是一種交換式的排序方法,基本思想就是相近的兩個數字作比較,小的放到前面,大的放後面,按照這個規則從頭向後比較,最大的數就被換到了陣列尾。

快速排序

快速排序是一種在實際應用中經常用到的排序演算法,它的應用場景是大規模的資料排序,並且實際效能要好於歸併排序。它的基本原理是從陣列中選取一個元素,把所有大於這個元素的數都放到它的後面,所有小於這個元素的數都放到它的前面,然後這個元素就把原陣列切分成了兩個部分,再分別對這個兩個部分進行同樣的操作,直到陣列不能再切分的時候,此時陣列為有序。

歸併排序

“歸併”的含義是將兩個或兩個以上的有序表組合成一個新的有序表,歸併排序和快排一樣也採用的是分治的思想,它的基本原理是通過對若干個有序結點序列的合併為一個有序序列來實現排序的。

基數排序

基數排序(升序)是一種非比較式的排序方式,和之前博文中提到的快排,氣泡排序,插入排序這些排序演算法不一樣,它沒有使用任何交換的方式,它的基本思想是通過分配的方法把元素從小到大分配,以到達排序的作用。

比較

複雜度比較
穩定性是指如果存在多個具有相同排序碼的記錄,經過排序後,這些記錄的相對次序仍然保持不變,則這種排序演算法稱為穩定的。

應用場景

(1)若n較小(如n≤50),可採用直接插入或直接選擇排序。
 當記錄規模較小時,直接插入排序較好;否則因為直接選擇移動的記錄數少於直接插人,應選直接選擇排序為宜。
(2)若檔案初始狀態基本有序(指正序),則應選用直接插人、冒泡或隨機的快速排序為宜;
(3)若n較大,則應採用時間複雜度為O(nlgn)的排序方法:快速排序、堆排序或歸併排序。
 快速排序是目前基於比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分佈時,快速排序的平均時間最短;
 堆排序所需的輔助空間少於快速排序,並且不會出現快速排序可能出現的最壞情況。這兩種排序都是不穩定的。
 若要求排序穩定,則可選用歸併排序。但前面介紹的從單個記錄起進行兩兩歸併的排序演算法並不值得提倡,通常可以將它和直接插入排序結合在一起使用。先利用直接插入排序求得較長的有序子序列,然後再兩兩歸併之。因為直接插入排序是穩定 的,所以改進後的歸併排序仍是穩定的。