按平均時間將排序分為四類:
(1)平方階(o(n2))排序
一般稱為簡單排序,例如直接插入、直接選擇和氣泡排序;
(2)線性對數階(o(nlgn))排序
如快速、堆和歸併排序;
(3)o(n1+£)階排序
£是介於0和1之間的常數,即0<£<1,如希爾排序;
(4)線性階(o(n))排序
如桶、箱和基數排序。
各種排序方法比較
簡單排序中直接插入最好,快速排序最快,當檔案為正序時,直接插入和冒泡均最佳。
影響排序效果的因素
因為不同的排序方法適應不同的應用環境和要求,所以選擇合適的排序方法應綜合考慮下列因素:
①待排序的記錄數目n;
②記錄的大小(規模);
③關鍵字的結構及其初始狀態;
④對穩定性的要求;
⑤語言工具的條件;
⑥儲存結構;
⑦時間和輔助空間複雜度等。
不同條件下,排序方法的選擇
(1)若n較小(如n≤50),可採用直接插入或直接選擇排序。
當記錄規模較小時,直接插入排序較好;否則因為直接選擇移動的記錄數少於直接插人,應選直接選擇排序為宜。
(2)若檔案初始狀態基本有序(指正序),則應選用直接插人、冒泡或隨機的快速排序為宜;
(3)若n較大,則應採用時間複雜度為o(nlgn)的排序方法:快速排序、堆排序或歸併排序。
快速排序是目前基於比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分布時,快速排序的平均時間最短;
堆排序所需的輔助空間少於快速排序,並且不會出現快速排序可能出現的最壞情況。這兩種排序都是不穩定的。
若要求排序穩定,則可選用歸併排序。但本章介紹的從單個記錄起進行兩兩歸併的排序演算法並不值得提倡,通常可以將它和直接插入排序結合在一起使用。先利用直接插入排序求得較長的有序子檔案,然後再兩兩歸併之。
因為直接插入排序是穩定的,所以改進後的歸併排序仍是穩定的。
排序演算法的穩定性
1) 穩定的:如果存在多個具有相同排序碼的記錄,經過排序後,這些記錄的相對次序仍然保持不變,則這種排序演算法稱為穩定的。
插入排序、氣泡排序、歸併排序、分配排序(桶式、基數)都是穩定的排序演算法。
2)不穩定的:否則稱為不穩定的。
直接選擇排序、堆排序、shell排序、快速排序都是不穩定的排序演算法。
[原創]幾種常用排序演算法總結!您所在位置:程式設計愛好者** — 程式設計愛好者論壇
前兩天為準備考軟體設計師就順便複習了下幾個常用的排序演算法,今天貼出來,供大家參考!對其中的錯漏之處,敬請指正!
排序 所謂排序,就是要整理檔案中的記錄,使之按關鍵字遞增(或遞減)次序排列起來。當待排序記錄的關鍵字都不相同時,排序結果是惟一的,否則排序結果不惟一。
在待排序的檔案中,若存在多個關鍵字相同的記錄,經過排序後這些具有相同關鍵字的記錄之間的相對次序保持不變,該排序方法是穩定的;若具有相同關鍵字的記錄之間的相對次序發生改變,則稱這種排序方法是不穩定的。
要注意的是,排序演算法的穩定性是針對所有輸入例項而言的。即在所有可能的輸入例項中,只要有乙個例項使得演算法不滿足穩定性要求,則該排序演算法就是不穩定的。
一.插入排序
插入排序的基本思想是每步將乙個待排序的記錄按其排序碼值的大小,插到前面已經排好的檔案中的適當位置,直到全部插入完為止。插入排序方法主要有直接插入排序和希爾排序。
①.直接插入排序(穩定)
接插入排序的過程為:在插入第i個記錄時,r1,r2,..ri-1已經排好序,將第i個記錄的排序碼ki依次和r1,r2,..
,ri-1的排序碼逐個進行比較,找到適當的位置。使用直接插入排序,對於具有n個記錄的檔案,要進行n-1趟排序。
**如下:
void dir_insert(int a,int n) //直接插入排序
int j,t;
for(int i=1;i
t=a[i];
j=i-1;
while(a[j]>t)
a[j+1]=a[j];
j--;
a[j+1]=t;
②.希爾排序(不穩定):
希爾(shell)排序的基本思想是:先取乙個小於n的整數d1作為第乙個增量把檔案的全部記錄分成d1個組。所有距離為d1的倍數的記錄放在同乙個組中。
先在各組內進行直接插入排序;然後,取得第二個增量d2 一般取d1=n/2,di+1=di/2。如果結果為偶數,則加1,保證di為奇數。
希爾排序是不穩定的,希爾排序的執行時間依賴於增量序列,其平均時間複雜度為o(n^1.3).
**如下:
void shell(int a,int n) //shell排序
int i,j,k,t;
n/2)%2 == 0 ? k = n/2+1 : k = n/2; //保證增量為奇數
while(k > 0)
for(j=k;j
t = a[j];
i = j - k;
while(i>=0 && a[i]>t)
a[i+k]=a[i];
i=i-k;
a[i+k]=t;
if(k == 1) break;
k/2)%2 ==0 ? k=k/2+1 : k=k/2;
二.選擇排序
選擇排序的基本思想是每步從待排序的記錄中選出排序碼最小的記錄,順序存放在已排序的記錄序列的後面,直到全部排完。選擇排序中主要使用直接選擇排序和堆排序。
①.直接選擇排序(不穩定)
直接選擇排序的過程是:首先在所有記錄中選出序碼最小的記錄,把它與第1個記錄交換,然後在其餘的記錄內選出排序碼最小的記錄,與第2個記錄交換......依次類推,直到所有記錄排完為止。
無**件初始狀態如何,在第i趟排序中選出最小關鍵字的記錄,需要做n-i次比較,因此,總的比較次數為n(n-1)/2=o(n^2)。當初始檔案為正序時,移動次數為0;檔案初態為反序時,每趟排序均要執行交換操作,總的移動次數取最大值3(n-1)。直接選擇排序的平均時間複雜度為o(n^2)。
直接選擇排序是不穩定的。
**如下:
void dir_choose(int a,int n) //直接選擇排序
int k,t;
for(int i=0;i
k=i;
for(int j=i+1;j
if(a[j]
if(k!=i)
t=a[i];
a[i]=a[k];
a[k]=t;
②.堆排序(不穩定)
堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進。n個關鍵字序列
k1,k2,...,kn稱為堆,當且僅當該序列滿足(ki<=k2i且ki<=k2i+1)或(ki>=k2i且ki>=k2i+1),(1<=i<=n/2)。根結點(堆頂)的關鍵字是堆裡所有結點關鍵字中最小者,稱為小根堆;根結點的關鍵字是堆裡所有結點關鍵字中最大者,稱為大根堆。
若將此序列所儲存的向量r[1..n]看作是一棵完全二叉樹的儲存結構,則堆實質上是滿足如下性質的完全二叉樹:樹中任一非葉結點的關鍵字均不大於(或不小於)其左右孩子(若存在)結點的關鍵字。
堆排序的關鍵步驟有兩個:一是如何建立初始堆;二是當堆的根結點與堆的最後乙個結點交換後,如何對少了乙個結點後的結點序列做調整,使之重新成為堆。堆排序的最壞時間複雜度為o(nlog2n),堆排序的平均效能較接近於最壞效能。
由於建初始堆所需的比較次數較多,所以堆排序不適宜於記錄較少的檔案。堆排序是就地排序,輔助空間為o(1),它是不穩定的排序方法。
排序演算法總結
常見的排序方式有6種 簡單排序裡面的有 插入排序 選擇排序 氣泡排序,時間複雜度為o n 2 線性對數階的排序 歸併排序 merge sort 快速排序,堆排序,時間複雜度為o nlogn 在n 50的情況下,最好使用插入排序或者選擇排序,由於選擇排序移動次數比插入排序少,在資料量比較多的情況,推薦...
排序演算法總結
熱2已有 2573 次閱讀 2009 09 01 13 23 填問卷贏好書華章讀者調研活動結果公布 一 選擇排序 1.基本思想 每一趟從待排序的資料元素中選出最小 或最大 的乙個元素,順序放在已排好序的數列的最後,直到全部待排序的資料元素排完。2.排序過程 示例 初始關鍵字 49 38 65 97 ...
排序演算法總結
9,3,5,1,6,2,8,4,7 3,5,1,6,2,8,4,7,9 3,1,5,2,6,4,7,8,9 1,3,2,5,4,6,7,8,9 1,2,3,4,5,6,7,8,9 1,2,3,4,5,6,7,8,9 1,2,3,4,5,6,7,8,9 1,2,3,4,5,6,7,8,9 快速排序 設...