排序演算法涉及了廣泛的演算法分析技術,對排序問題的研究也促進了檔案處理技術的發展,這裡由於有些外排序問題在執行時必須不斷地從外存讀取資訊(這部分資訊由於太大而無法在記憶體中直接存放)。內排序(internal sort),則是指在記憶體中完成排序。
以「儲存在陣列中的一組記錄」為資料型別,陣列中的每乙個記錄內部都有乙個域成為排序關鍵碼(sort key)。排序就是重排一組記錄,使其關鍵碼域的值具有規定的順序。排序問題中的記錄可有相同的關鍵碼key,涉及到排序演算法是否穩定,穩定的意思是演算法不改變具有相同關鍵碼記錄的原始輸入順序。
分析排序演算法時,傳統方法是衡量關鍵碼之間進行比較的次數,有時用統計演算法中的交換次數。這種方法與演算法消耗的時間有關,而與機器和資料型別無關。排序演算法的時間複雜度:o(n*n) -----> o(nlog2n) -----> o(n)。
人們之所以熱衷於研究多種排序方法,是因為排序在計算機中所處的地位;另一方面,由於這些方法各有優缺點,難以得出哪個最好和哪個最壞的結論。因此,排序方法的選用視具體場合而定。一般情況下考慮的原則有,(1)待排序的記錄個數;(2)記錄本身的大小;(3)關鍵字的分布情況;(4)對排序穩定性的要求。
下面就從這幾個方面對下面所討論的各種排序方法做綜合比較。(1)按平均的時間效能來分,有三類排序方法。時間複雜度為o(nlog2n)的方法有快速排序、堆排序、歸併排序。其中快速排序目前被認為是最快的一種排序方法,後兩者的比較,在n值較大的情況下,歸併排序比堆排序更快。時間複雜度為o(n*n)的方法有插入排序、氣泡排序、選擇排序。其中插入排序最為常用,特別是對於已按關鍵字基本有序排列的序列尤為如此,選擇排序中記錄移動次數最少。時間複雜度為o(n)的排序方法只有基數排序一種。簡單排序(選擇、冒泡和插入排序)(selection sort、bubble sort、insert sort)
快速排序(quick sort)
歸併排序(merge sort)
希爾排序(shell sort)
堆排序(heap sort)
基數排序(radix sort)
(2)當待排序記錄序列按關鍵字順序有序時,插入排序和氣泡排序能達到o(n)的時間複雜度;而對於快速排序,這是最不好的情況,此時的時間效能退化為o(n*n),因此應盡量避免。
(3)希爾排序、堆排序和歸併排序的時間效能不隨著記錄序列中關鍵字的分布而改變。在大多數情況下,人們應事先對要排序的記錄關鍵字的分布情況有所了解,才可對症下藥,選擇有針對性的排序方法。
(4)以上對排序的時間複雜度的討論主要考慮排序過程中所需要進行的關鍵字間的比較次數,當待排序記錄中其他各資料項比關鍵字占有更大的資料量時,還應考慮到排序過程中移動記錄的操作時間,有時這種操作的時間在整個排序過程中佔的比例更大,從這個觀點考慮,簡單排序的三種排序方法中氣泡排序效率最低。
空間效能是指排序過程中所需的輔助空間大小。
(1)所有的簡單排序方法(is、bs、ss)和堆排序的空間複雜度均為o(1);
(2)快速排序的為o(log2n),為遞迴程式執行過程中樞軸所需的輔助空間;
(3)歸併排序和基爾排序所需的輔助空間最多,空間複雜度為o(n)。
(1)穩定的排序方法是指對於兩個關鍵字相等的記錄在經過排序後,不改變它們在排序之前在序列中的相對位置;
(2)除快速排序、堆排序是不穩定的排序方法外,前面的其他排序方法都是穩定的。eg.對關鍵字序列(8_1,5,8_2,3)進行快速排序,其結果為(3,5,8_2,8_1);
(3)「穩定性」是由方法本身決定的。一般來說,排序過程中所進行的比較操作和交換資料僅發生在相鄰的資料之間,沒有大步距的資料調整時,排序方法是穩定的。如果選擇排序沒有滿足穩定的要求是因為每趟在右部無序區找到最小記錄後,常要跳過很多記錄進行交換調整,顯然若把「交換調整」的方式改一改就能寫出穩定的選擇排序演算法,而對不穩定的排序方法,不論其演算法的描述形式如何,總能舉出乙個說明它不穩定的例項。
在使用排序方法時,有下列幾種選擇:
(1)若待排序的記錄個數n值較小(例如n<30),則可以選用插入排序,但記錄所含資料項較多時,所佔儲存量大時,應選擇ssa。反之,如果待排序的記錄個數n值較大,應選用快排。但如果待排序記錄關鍵字有「有序」傾向時,要慎用快排,而寧可選擇歸併或堆排序。
(2)快速排序和歸併排序在n值較小時的效能不及插入排序,因此實際應用中,可將它們和插入排序混合使用。如在快排劃分子區間的長度小於某值時,轉而呼叫插入排序;或對待排序記錄序列先逐段進行插入排序,然後再利用歸併操作進行兩兩歸併直至整個序列有序為止。
(3)基數排序的時間複雜度為o(d*n),因此特別適合於待排序記錄數n很大,而關鍵字「位數d」較小的情況,並且還可以調整「基數」(如將基數定為100或1000等)以減少基數排序的趟數d的值。
(4)一般情況下,進行排序的記錄的關鍵字各不相同,則排序時所用的排序方法是否穩定無關緊要,但在有些情況下,排序必須用穩定的排序方法。eg.一組學生記錄已按學號的順序有序,由於某種需要,希望根據學生的身高進行一次排序,並且排序結果應保證相同身高的同學之間的學號有序。顯然,對身高排序時必須使用穩定的排序方法。
上面對排序方法的討論是比較單純的資料模型,而實際問題往往比這更複雜,需要綜合運用多種排序方法。
eg.有些場合,關鍵字的組成結構不一定是整數型,每個分關鍵字有不同的屬性值。
汽車牌照皖ah3784、皖ah6612是字母、數字的混合結構。這是一種多關鍵字的排序應用,需要把關鍵字拆成漢字、字母、數字3個分關鍵字,進行3次排序。而第2/3次的排序又必須是穩定的排序方法。
演算法的時間複雜度是指演算法執行過程中所需要的基本運算次數。演算法的空間複雜度是指對乙個演算法在執行過程中臨時占用儲存空間大小的量度。
排序演算法總結
1 直接插入排序 1 穩定性 穩定 2 適用情況 待排記錄規模較小,或者記錄已經基本有序 2 希爾排序 1 穩定性 不穩定 2 特點 希爾排序的執行時間依賴於增量序列,它的效率比直接插入排序有較大的改進。3 氣泡排序 1 穩定性 穩定 2 特點 當待排記錄基本有序是,氣泡排序是不錯的選擇 但由於氣泡...
排序演算法總結
1 選擇排序 選擇排序的思想是依次從待排序數列中選擇最大 小 的 第二大 小 的等等,然後依次重新排列為有序數列。void selectionsort int a,int n if min i 時間複雜度o n 2 2 歸併排序 void merge int a,int left,int mid,i...
排序演算法總結
學習了這麼多的排序演算法,還沒有做個總結,呵呵 氣泡排序 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是 o n 2 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...