排序經常作為其他演算法的輔助演算法出現在各種場合,下面對排序來做乙個彙總
(1)氣泡排序
思想:相鄰的兩個數比較,較小(大)的那個數向上移動(冒泡),而後最小(大)的數漂到最頂端
**實現:
樸素版:
void bubblesort(int *a,int size)
}if(!bubble)
break;}}
氣泡排序的演算法時間複雜度為o(n^2)
(2)直接選擇排序
思想:通過n-i次比較,在i到n-1中選擇最小的乙個數,與i交換,這種演算法雖然比較次數較多,但交換次數大為減少
**實現:
void selectsort(int *a,int size)
if(i!=minnum)}}
演算法時間複雜度為o(n^2),略優於氣泡排序
(3)直接插入排序
思想:在乙個有序區中將待排序的數插入到適當位置,直至全部插入完畢
**實現:
void insertsort(int *a,int size)
a[j+1] = temp;}}
}
演算法的時間複雜度為o(n^2)
(4)錦標賽排序
思想:錦標賽排序又叫樹型排序,屬於選擇排序的一種。直接選擇排序之所以不夠高效就是因為沒有把前一趟比較的結果保留下來,每次都有很多重複的比較。錦標賽排序就是要克服這一缺點。
它的基本思想與體育淘汰賽類似,首先取得n個元素的關鍵字,進行兩兩比較,得到 n/2 個比較的優勝者,將其作為第一次比較的結果保留下來,然後對這些元素再進行關鍵值的兩兩比較,…,如此重複,直到選出乙個關鍵字最小的物件為止。
**實現及演示可參照:錦標賽排序詳解
(5)堆排序
思想:堆的定義類似於完全二叉樹,小頂堆是父節點比任意子節點的關鍵字都小,並且其左右子堆滿足同樣的條件,大頂堆則相反。故堆排序利用了這種特性,對於大頂堆來說,其根節點是最大值,而後將其輸出,其餘各節點調整,成為乙個新的大頂堆,依次將跟節點輸出,則完成排序。
堆的儲存使用陣列來完成,對於父節點i,其兩個子節點的的位置為2i+1,2i+2;對於乙個子節點i,其父節點為(i-1)/2;
每次輸出根節點後,將根節點的值與最後乙個節點的值對換,則輸出完畢後該陣列變成有序陣列。
**實現:堆排序實現**
演算法時間複雜度:o(nlogn)
(6)歸併排序
思想:將a[0....n-1]分成兩個子陣列a1[0.....n/2], a2[n/2+1.......n-1],分別對這兩個陣列進行單獨排序,而後將這兩個有序陣列歸併成乙個有序陣列
**實現:
void mergearray(int *a,int low,int mid,int high)
時間複雜度為:o(nlogn);
歸併排序的兩點改進:1)在陣列比較短的時候可以不用遞迴,而是用插入排序或者選擇排序;
2)歸併排序的過程中可以用記錄陣列下標的方式代替申請新的空間;從而避免a陣列與輔助陣列之間的頻繁移動;
(7)快速排序
思想:快速排序是一種基於劃分的排序方法,在陣列中取乙個基準數,分割槽過程,將比該基準數小的數放到該數的前面,將比該基準數大的放到後面,而後對前後兩個區再使用快速排序,直到排序完成。
**實現:快速排序**實現
演算法的時間複雜度:o(nlogn);
(8)外排序
思想:外排序是指處理超過記憶體限度的資料的排序演算法,通常是將中間結果放在外存上,外排序常採用「排序-歸併」策略
排序階段,讀入能放到外存上的資料量,將其排序輸出到臨時檔案,依次進行,直到將待排序陣列分成多個有序檔案
歸併階段,將這些臨時檔案合成乙個大的有序檔案
例:
排序演算法的分析:
這裡的穩定是指 若未排序兩個相等的關鍵字的前後位置在排序後與排序前前後位置相等,則稱其為穩定的,若在比較的時候是相鄰的數比較則最後結果是穩定的。
事實上,如果在排序的時候關鍵字和關鍵字所在在位置index同時參與排序,則不穩定演算法可以轉化成穩定演算法
排序演算法 排序演算法彙總
排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...
排序演算法 排序演算法彙總
排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...
排序演算法 排序演算法彙總
排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...