排序方法的總結

2022-03-14 06:45:30 字數 4434 閱讀 6657

1)插入排序:直接插入排序、希爾排序

2)交換排序:氣泡排序、快速排序

3)選擇排序:直接選擇排序、堆排序

4)歸併排序:歸併排序

5)分配排序:桶排序、基數排序

1)平方階(o(n2))排序

一般稱為簡單排序,例如直接插入、直接選擇和氣泡排序;

2)線性對數階(o(nlgn))排序

如快速、堆和歸併排序;

3)o(n1+£)階排序

£是介於0和1之間的常數,即0<£<1,如希爾排序;

4)線性階(o(n))排序

如桶、箱和基數排序。

1)內部排序

在排序過程中,若整個檔案都是放在記憶體中處理,排序時不涉及資料的內、外存交換,則稱之為內部排序(簡稱內排序)

2)外部排序

若排序過程中要進行資料的內、外存交換,則稱之為外部排序

外部排序指的是大檔案的排序,面試的時候,面試官喜歡問,給你乙個非常非常大的檔案(比如1t),一行乙個數(或者乙個單詞),記憶體最多只有8g,硬碟足夠大,cpu很高階……然後要你給這個檔案裡面的資料排序。你要怎麼辦?

這其實就要用到外部排序。就是說要借助外儲存器進行多次的內/外存資料的交換,因為記憶體不足以載入所有的資料,所以只能一部分一部分地載入。

大多數排序演算法都有兩個基本操作:

注意:

第(2)種基本操作的實現依賴於待排序記錄的儲存方式。

1)以順序表(或直接用向量)作為儲存結構

排序過程:對記錄本身進行物理重排,即通過關鍵字之間的比較判定,將記錄移到合適的位置。

2)以鍊錶作為儲存結構

排序過程:無須移動記錄,僅需修改指標。通常將這類排序稱為鍊錶(或鏈式)排序。

3)以順序的方式儲存待排序的記錄,但同時建立乙個輔助表(如包括關鍵字和指向記錄位置的指標組成的索引表)

排序過程:只需對輔助表的表目進行物理重排(即只移動輔助表的表目,而不移動記錄本身)。適用於難於在鍊錶上實現,且仍需避免排序過程中移動記錄的排序方法。

在待排序的檔案中,若存在多個關鍵字相同的記錄,經過排序後這些具有相同關鍵字的記錄之間的相對次序保持不變,該排序方法是穩定的

若具有相同關鍵字的記錄之間的相對次序發生變化,則稱這種排序方法是不穩定的

注意:

排序演算法的穩定性是針對所有輸入例項而言的。即在所有可能的輸入例項中,只要有乙個例項使得演算法不滿足穩定性要求,則該排序演算法就是不穩定的。

因為不同的排序方法適應不同的應用環境和要求,所以選擇合適的排序方法應綜合考慮下列因素:

①待排序的記錄數目n;

②記錄的大小(規模);

③關鍵字的結構及其初始狀態;

④對穩定性的要求;

⑤語言工具的條件;

⑥儲存結構;

⑦時間和輔助空間複雜度等。

下面是乙個總的**,大致總結了我們常見的所有的排序演算法的特點。

排序法最好時間

平均時間

最差情形

穩定度額外空間

備註 冒泡

o(n)

o(n2)

o(n2)

穩定o(1)

n小時較好

交換o(n2)

o(n2)

不穩定o(1)

n小時較好

簡單選擇

o(n2)

o(n2)

o(n2)

不穩定o(1)

n小時較好

直接插入

o(n)

o(n2)

o(n2)

穩定o(1)

大部分已排序時較好

基數o(logrb)

o(logrb)

穩定o(n)

b是真數(0-9),

r是基數(個十百)

shell

o(n)

o(nlogn)

o(ns) 不穩定

o(1)

s是所選分組

快速o(nlogn)

o(nlogn)

o(n2)

不穩定o(logn)

n大時較好

歸併o(nlogn)

o(nlogn)

o(nlogn)

穩定o(n)

n大時較好

堆o(nlogn)

o(nlogn)

o(nlogn)

不穩定o(1)

n大時較好

(1)若n較小(如n≤50),可採用直接插入或直接選擇排序。

當記錄規模較小時,直接插入排序較好;否則因為直接選擇移動的記錄數少於直接插人,應選直接選擇排序為宜。

(2)若檔案初始狀態基本有序(指正序),則應選用直接插人、冒泡或隨機的快速排序為宜;

(3)若n較大,則應採用時間複雜度為o(nlgn)的排序方法:快速排序、堆排序或歸併排序。

快速排序是目前基於比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分布時,快速排序的平均時間最短;

堆排序所需的輔助空間少於快速排序,並且不會出現快速排序可能出現的最壞情況。這兩種排序都是不穩定的。

若要求排序穩定,則可選用歸併排序。但本章介紹的從單個記錄起進行兩兩歸併的  排序演算法並不值得提倡,通常可以將它和直接插入排序結合在一起使用。先利用直接插入排序求得較長的有序子檔案,然後再兩兩歸併之。因為直接插入排序是穩定的,所以改進後的歸併排序仍是穩定的。

1)快速排序(quicksort)

從本質上來說,快速排序是歸併排序的就地版本。

快速排序比大部分排序演算法都要快。儘管我們可以在某些特殊的情況下寫出比快速排序快的演算法,但是就通常情況而言,沒有比它更快的了。快速排序是遞迴的,對於記憶體非常有限的機器來說,它不是乙個好的選擇。

2)歸併排序(mergesort)

歸併排序先分解要排序的序列,從1分成2,2分成4,依次分解,當分解到只有1個一組的時候,就可以排序這些分組,然後依次合併回原來的序列中,這樣就可以排序所有資料。合併排序比堆排序稍微快一點,但是需要比堆排序多一倍的記憶體空間,因為它需要乙個額外的陣列。

3)堆排序(heapsort)

堆排序適合於資料量非常大的場合(百萬資料)。

堆排序不需要大量的遞迴或者多維的暫存陣列。這對於資料量非常巨大的序列是合適的。比如超過數百萬條記錄,因為快速排序,歸併排序都使用遞迴來設計演算法,在資料量非常大的時候,可能會發生堆疊溢位錯誤。

4)shell排序(shellsort)

shell排序比氣泡排序快5倍,比插入排序大致快2倍。shell排序比起quicksort,mergesort,heapsort慢很多。但是它相對比較簡單,它適合於資料量在5000以下並且速度並不是特別重要的場合。它對於資料量較小的數列重複排序是非常好的。

5)插入排序(insertsort)

插入排序通過把序列中的值插入乙個已經排序好的序列中,直到該序列的結束。插入排序是對氣泡排序的改進。它比氣泡排序快2倍。一般不用在資料大於1000的場合下使用插入排序,或者重複排序超過200資料項的序列。

6)氣泡排序(bubblesort)

氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是o(n^2)的演算法。

7)交換排序(exchangesort)和選擇排序(selectsort)

這兩種排序方法都是交換方法的排序演算法,效率都是 o(n2)。在實際應用中處於和氣泡排序基本相同的地位。它們只是排序演算法發展的初級階段,在實際中使用較少。

8)基數排序(radixsort)

基數排序和通常的排序演算法並不走同樣的路線。它是一種比較新穎的演算法,但是它只能用於整數的排序,如果我們要把同樣的辦法運用到浮點數上,我們必須了解浮點數的儲存格式,並通過特殊的方式將浮點數對映到整數上,然後再對映回去,這是非常麻煩的事情,因此,它的使用同樣也不多。而且,最重要的是,這樣演算法也需要較多的儲存空間。

參考:插入排序:

交換排序:

選擇排序:

歸併排序:

分配排序:

排序方法的總結

img img 排序方法的總結 今天一共學習了四種排序方法,氣泡排序,選擇排序,插入排序和希爾排序。首先是最簡單的氣泡排序,如下 public static int maopao int x return x 假設有陣列3,4,5,1,2 則第一輪排序結果1,4,5,3,2 第二輪排序結果1,2,5...

排序方法總結

mysort.h ifndef mysort h included define mysort h included 交換排序 氣泡排序,快速排序 void bubblesort int arr,int arrlen int slipforquicksort int arr,int arrleft,...

排序方法總結

一 選擇排序法 1 預設第乙個數已經排序,且預設第乙個數為最小的數,定義min用來存放最小的數在陣列中的位置。2 用min指向的數 即第乙個數 和第二個數比較,如果第乙個數比第二個數小,min指向不變 為0 如果第乙個數比第二個數大,min指向第二個數 為1 3 用min指向的數和第三個數比較,如果...