專題七 排序演算法

2021-09-26 09:23:14 字數 3252 閱讀 4240

(1) 基本思想:每一趟從待排序的資料元素中選出最小(或最大)的乙個元素,順序放在待排序的數列的最前,直到全部待排序的資料元素排完。

(2)排序過程:

【示例】:

初 始 關鍵字 [49 38 65 97 76 13 27 49]

第一趟排序後 13[38 65 97 76 49 27 49]

第二趟排序後 13 27[65 97 76 49 38 49]

第三趟排序後 13 27 38 [97 76 49 65 49]

第四趟排序後 13 27 38 49 [76 97 65 49]

第五趟排序後 13 27 38 49 49 [97 65 76]

第六趟排序後 13 27 38 49 49 65 [97 76]

第七趟排序後 13 27 38 49 49 65 76 [97]

最後排序結果 13 27 38 49 49 65 76 97

舉個栗子:

輸入n個數,將n個數按從小到大的順序輸出(n<=10000)。

輸入樣例:

849 38 65 97 76 13 27 49

輸出樣例:

13 27 38 49 49 65 76 97

即:①讀入資料存放在a陣列中。

②在a[1]~a[n]中選擇值最小的元素,與第1位置元素交換,則把最小值元素放入a[1]中。

③在a[2]~a[n]中選擇值最小的元素,與第2位置元素交換,則把最小值元素放入a[2]中,……

④直到第n-1個元素與第n個元素比較排序為止。

程式實現方法:用兩層迴圈完成演算法,外層迴圈i控制當前序列最小值存放的陣列位置,內層迴圈j控制從i+1到n序列中選擇最小的元素所在位置k。

氣泡排序的思想:以n個人站隊為例,從第1個開始,依次比較相鄰的兩個是否逆序對(高在前,矮在後),若逆序就交換這兩人,即第1個和第2個比,若逆序就交換兩人,接著第2個和第3個比,若逆序就交換兩人,接著第3個和第4個比,若逆序就交換兩人,……,直到n-1和n比較,經過一輪比較後,則把最高的人排到最後,即將最高的人像冒泡一樣逐步冒到相應的位置。原n個人的排序問題,轉換為n-1個人的排序問題。第二輪從第1個開始,依次比較相鄰的兩個人是否逆序對,若逆序就交換兩人,直到n-2和n-1比較。如此,進行n-1輪後,隊列為有序的佇列。

從上述分析中可以看出,每進行一輪的比較之後,n個數的排序規模就轉化為n-1個數的排序規模。

例如有6個元素需要排序:

6 5 3 4 1 2

第一趟排序:

即:①讀入資料存放在a陣列中。

②比較相鄰的前後兩個資料,如果前面資料大於後面的資料,就將兩個資料交換。

③對陣列的第0個資料到n-1個資料進行一次遍歷後,最大的乙個資料就「冒」到陣列第n-1個位置。

④n=n-1,如果n不為0就重複前面二步,否則排序完成。

程式實現方法:用兩層迴圈完成演算法,外層迴圈i控制每輪要進行多少次的比較,第1輪比較n-1次,第2輪比較n-2次,……,最後一輪比較1次。內層迴圈j控制每輪i次比較相鄰兩個元素是否逆序,若逆序就交換這兩個元素。

插入排序思想:就像打牌時抓牌的情景,為了方便打牌,抓牌時一般一邊抓牌一邊按花色和大小插入恰當的位置,當抓完所有的牌時,手中的牌便是有序的,這排序方法即插入排序。

當讀入乙個元素時,在已經排序好的序列中,搜尋它正確的位置,再放入讀入的元素。但不該忽略乙個重要的問題:在插入這個元素前,應當先將將它後面的所有元素後移一位,以保證插入位置的原元素不被覆蓋。

例如:設n=8,陣列a中8個元素是: 36,25,48,12,65,43,20,58,執行插入排序程式後,其資料變動情況:

第0步:[36] 25 48 12 65 43 20 58

第1步:[25 36] 48 12 65 43 20 58

第2步:[25 36 48] 12 65 43 20 58

第3步:[12 25 36 48] 65 43 20 58

第4步:[12 25 36 48 65] 43 20 58

第5步:[12 25 36 43 48 65] 20 58

第6步:[12 20 25 36 43 48 65] 58

第7步:[12 20 25 36 43 48 58 65]

#include

using namespace std;

const

int maxn=

10001

;int

main()

}for

(i=0

;i) cout<

<<

" ";

//輸出排序的結果

return0;

}

桶排序的思想是若待排序的值在乙個明顯有限範圍內(整型)時,可設計有限個有序桶,待排序的值裝入對應的桶(當然也可以裝入若干個值),桶號就是待排序的值,順序輸出各桶的值,將得到有序的序列。

栗子:輸入n個0到100之間的整數,由小到大排序輸出。

#include

#include

using namespace std;

intmain()

int b[

101]

,n,i,j,k;

memset

(b,0

,sizeof

(b))

;//初始化

cin>>n;

for(i=

1;i<=n;i++

)for

(i=0

;i<=

100;i++

)//輸出排序結果

while

(b[i]

>0)

//相同的整數,要重複輸出

cout<

}

穩定性比較

插入排序、氣泡排序及其他線形排序是穩定的。

選擇排序、快速排序、堆排序是不穩定的。

插入排序、氣泡排序、選擇排序的時間複雜性為o(n2);快速排序、堆排序、歸併排序的時間複雜性為o(nlog2n);桶排序的時間複雜性為o(n);

HLS 開發學習(七)排序

歸併排序 學習自parallel programming for fpgas the hls book 大夥應該都很了解了,就是將乙個新的元素插入到乙個有序陣列中,並繼續保持有序。每步將乙個待排序的記錄,按其關鍵碼值的大小插入前面已經排序的檔案中適當位置上,直到全部插入完為止。現在來考慮它的優化問題...

資料結構與演算法分析 七 排序

演算法的輸入可以互換。每個演算法接收乙個含有元素的陣列和乙個包含元素個數的整數。傳入的元素個數n是合法的,資料從0處開始 假設 和 運算子都存在 首先將第乙個關鍵字和第二個關鍵字進行比較,若為逆序則將兩個記錄交換,然後比較第二個記錄和第三個記錄,依次類推,知道第n 1個記錄和第n個記錄的關鍵字進行比...

資料結構複習之七 排序

重要參考資料 主要複製自這裡 一 排序的基本概念 穩定排序 如果排序表中有兩個相等元素,經過排序之後它們的相對位置不變,那麼這個演算法就是穩定的。二 插入排序 直接插入排序 插入排序是在乙個已經有序的小序列的基礎上,一次插入乙個元素。當然,剛開始這個有序的小序列只有1個元素,就是第乙個元素。比較是從...