(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個元素,就是第乙個元素。比較是從...