八大排序演算法

2021-07-27 21:13:46 字數 3182 閱讀 2119

排序的定義:

輸入:n個數:a1,a2,a3,...,an

輸出:n個數的排列:a1',a2',a3',...,an',使得a1'<=a2'<=a3'<=...<=an'。

in-place sort(不占用額外記憶體或占用常數的記憶體):插入排序、選擇排序、氣泡排序、堆排序、快速排序。

out-place sort:歸併排序、計數排序、基數排序、桶排序。

當需要對大量資料進行排序時,in-place sort就顯示出優點,因為只需要占用常數的記憶體。

設想一下,如果要對10000個資料排序,如果使用了out-place sort,則假設需要用200g的額外空間,則一台老式電腦會吃不消,但是如果使用in-place sort,則不需要花費額外記憶體。

stable sort:插入排序、氣泡排序、歸併排序、計數排序、基數排序、桶排序。

unstable sort:選擇排序

將乙個記錄插入到已排序好的有序表中,從而得到乙個新,記錄數增1的有序表。即:先將序列的第1個記錄看成是乙個有序的子串行,然後從第2個記錄逐個進行插入,直至整個序列有序為止。

要點:設立哨兵,作為臨時儲存和判斷陣列邊界之用

如果碰見乙個和插入元素相等的,那麼插入元素把想插入的元素放在相等元素的後面。所以,相等元素的前後順序沒有改變,從原無序序列出去的順序就是排好序後的順序,所以插入排序是穩定的。

void print(int a, int n ,int i) n為要排序數的個數

即:先將要排序的一組記錄按某個增量d(n/2,n為要排序數的個數)分成若干組子串行,每組中記錄的下標相差d.對每組中全部元素進行直接插入排序,然後再用乙個較小的增量(d/2)對它進行分組,在每組中再進行直接插入排序。繼續不斷縮小增量直至為1,最後使用直接插入排序完成排序。

void print(int a, int n ,int i)

} int main();

//shellinsertsort(a,8,1); //直接插入排序

shellsort(a,8); //希爾插入排序

print(a,8,8);

}

希爾排序時效分析很難,關鍵碼的比較次數與記錄移動次數依賴於增量因子序列d的選取,特定情況下可以準確估算出關鍵碼的比較次數和記錄的移動次數。目前還沒有人給出選取最好的增量因子序列的方法。增量因子序列可以有各種取法,有取奇數的,也有取質數的,但需要注意:增量因子中除1 外沒有公因子,且最後乙個增量因子必須為1。希爾排序方法是乙個不穩定的排序方法。

基本思想:

在要排序的一組數中,選出最小(或者最大)的乙個數與第1個位置的數交換;然後在剩下的數當中再找最小(或者最大)的與第2個位置的數交換,依次類推,直到第n-1個元素(倒數第二個數)和第n個元素(最後乙個數)比較為止。

簡單選擇排序的示例:

操作方法:

第一趟,從n 個記錄中找出關鍵碼最小的記錄與第乙個記錄交換;

第二趟,從第二個記錄開始的n-1 個記錄中再選出關鍵碼最小的記錄與第二個記錄交換;

以此類推.....

第i 趟,則從第i 個記錄開始的n-i+1 個記錄中選出關鍵碼最小的記錄與第i 個記錄交換,

直到整個序列按關鍵碼有序。

演算法實現 

void print(int a, int n ,int i)  

return k;

}

/**

* 選擇排序

* */

void selectsort(int a, int n)

print(a, n , i);

} } int main();

cout<

for(int j= 0; j<8; j++)

if (r[j]< r[min])

4. 選擇排序—堆排序(heap sort)

堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進。

基本思想:

堆的定義如下:具有n個元素的序列(k1,k2,...,kn),當且僅當滿足

時稱之為堆。由堆的定義可以看出,堆頂元素(即第乙個元素)必為最小項(小頂堆)。

若以一維陣列儲存乙個堆,則堆對應一棵完全二叉樹,且所有非葉結點的值均不大於(或不小於)其子女的值,根結點(堆頂元素)的值是最小(或最大)的。如:

(a)大頂堆序列:(96, 83,27,38,11,09)

(b)  小頂堆序列:(12,36,24,85,47,30,53,91)

初始時把要排序的n個數的序列看作是一棵順序儲存的二叉樹(一維陣列儲存二叉樹),調整它們的儲存序,使之成為乙個堆,將堆頂元素輸出,得到n 個元素中最小(或最大)的元素,這時堆的根節點的數最小(或者最大)。然後對前面(n-1)個元素重新調整使之成為堆,輸出堆頂元素,得到n 個元素中次小(或次大)的元素。依此類推,直到只有兩個節點的堆,並對它們作交換,最後得到有n個節點的有序序列。稱這個過程為堆排序。

因此,實現堆排序需解決兩個問題:

1. 如何將n 個待排序的數建成堆;

2. 輸出堆頂元素後,怎樣調整剩餘n-1 個元素,使其成為乙個新堆。

首先討論第二個問題:輸出堆頂元素後,對剩餘n-1元素重新建成堆的調整過程。

調整小頂堆的方法:

1)設有m 個元素的堆,輸出堆頂元素後,剩下m-1 個元素。將堆底元素送入堆頂((最後乙個元素與堆頂進行交換),堆被破壞,其原因僅是根結點不滿足堆的性質。

2)將根結點與左、右子樹中較小元素的進行交換。

3)若與左子樹交換:如果左子樹堆被破壞,即左子樹的根結點不滿足堆的性質,則重複方法 (2).

4)若與右子樹交換,如果右子樹堆被破壞,即右子樹的根結點不滿足堆的性質。則重複方法 (2).

5)繼續對不滿足堆性質的子樹進行上述交換操作,直到葉子結點,堆被建成。

稱這個自根結點到葉子結點的調整過程為篩選。如圖:

八大排序演算法

1.直接插入排序 原理 將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。實現 void insertsort node l,int length void shell ...

八大排序演算法

一 概述 八大排序演算法包括 1 插入排序之直接插入排序 straight insertion sort 2 插入排序之希爾排序 shells sort 3 選擇排序之簡單選擇排序 selection sort 4 選擇排序之堆排序 heap sort 5 交換排序之氣泡排序 bubble sort...

八大排序演算法

八大排序演算法 概述 排序有內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。我們這裡說說八大排序就是內部排序。當n較大,則應採用時間複雜度為o nlog2n 的排序方法 快速排序 堆排序或歸併排序序。快速排...