在開發中,對一組資料進行有序地排列是經常需要做的事情,所以掌握幾種甚至更多的排序演算法是絕對有必要的
本文章介紹的是排序演算法中較簡單的一種演算法:氣泡排序
題外話:在深入學習更多排序演算法後和在實際使用情況中,氣泡排序的使用還是極少的。它適合資料規模很小的時候,而且它的效率也比較低,但是作為入門的排序演算法,還是值得學習的
先嘗試用最簡單的想法去實現排序,以此來比較學習氣泡排序
問題:設有一陣列,其大小為10個元素(int str[10])陣列內的資料是無序。現在要求我們通過程式設計將這個無序的陣列變成乙個從小到大排序的陣列(從下標為0開始)
思路:按照題目的要求,毫無疑問,正確的結果應該就像這樣:1 2 3 4 5 6 7 8 9 10要做到這樣,最簡單和最直接想到的方法就是進行對比交換。
**:
#include
void
swap
(int *a, int *b)
; //交換兩個數
intmain
() //排序,從a[0]開始排,從小到大
for (i = 0; i < 10; i++) } } //將十個數輸出
for (i = 0; i < 10; i++) printf("%d\n", str[i]); return
0;}void
swap
(int *a, int *b)
這個方法是比較容易想到的實現方法。但存在不足:就是本來位於前面的較小數被交換到後面
演示:
開始:9 4 5 6 8 3 2 7 10 1(下標從左到右分別是0~9)按照上面的程式進行對比交換
第一次:4 9 5 6 8 3 2 7 10 1
第二次:4 9 5 6 8 3 2 7 10 1
。。。:(沒有交換)
第五次:3 9 5 6 8 4 2 7 10 1
第六次:2 9 5 6 8 3 4 7 10 1
。。。:(沒有交換)
第十次:1 9 5 6 8 3 4 7 10 2
可以看出,原來較小的數是在前面的,經過一輪的交換後放到後面了
那麼怎樣解決這個不足呢?可以使用
氣泡排序
什麼是氣泡排序呢?
你可以這樣理解:(從小到大排序)存在10個不同大小的氣泡,由底至上地把較少的氣泡逐步地向上公升,這樣經過遍歷一次後,最小的氣泡就會被上公升到頂(下標為0),然後再從底至上地這樣公升,迴圈直至十個氣泡大小有序。 在
氣泡排序中,最重要的思想是兩兩比較,將兩者較少的公升上去
氣泡排序最壞情況的時間複雜度是o(n²)
**:
#include
void
swap
(int *a, int *b)
;int
main
(); int i, j; for (i = 0; i < 10; i++) } } for (i = 0; i < 10; i++) return
0;}void
swap
(int *a, int *b)
氣泡排序演算法只會將較少的逐步向上推,不會造成文章前面所說的不足,這裡就不給予演示。
有些追求完美的人就會思考,氣泡排序能不能優化呢?
答案是能的。如何優化的文章在
這裡。在開發中,對一組資料進行有序地排列是經常需要做的事情,所以掌握幾種甚至更多的排序演算法是絕對有必要的
本文章介紹的是排序演算法中較簡單的一種演算法:氣泡排序
題外話:在深入學習更多排序演算法後和在實際使用情況中,氣泡排序的使用還是極少的。它適合資料規模很小的時候,而且它的效率也比較低,但是作為入門的排序演算法,還是值得學習的
先嘗試用最簡單的想法去實現排序,以此來比較學習氣泡排序
問題:設有一陣列,其大小為10個元素(int str[10])陣列內的資料是無序。現在要求我們通過程式設計將這個無序的陣列變成乙個從小到大排序的陣列(從下標為0開始)
思路:按照題目的要求,毫無疑問,正確的結果應該就像這樣:1 2 3 4 5 6 7 8 9 10要做到這樣,最簡單和最直接想到的方法就是進行對比交換。
**:
#include
void
swap
(int *a, int *b)
; //交換兩個數
intmain
() //排序,從a[0]開始排,從小到大
for (i = 0; i < 10; i++) } } //將十個數輸出
for (i = 0; i < 10; i++) printf("%d\n", str[i]); return
0;}void
swap
(int *a, int *b)
這個方法是比較容易想到的實現方法。但存在不足:就是本來位於前面的較小數被交換到後面
演示:
開始:9 4 5 6 8 3 2 7 10 1(下標從左到右分別是0~9)按照上面的程式進行對比交換
第一次:4 9 5 6 8 3 2 7 10 1
第二次:4 9 5 6 8 3 2 7 10 1
。。。:(沒有交換)
第五次:3 9 5 6 8 4 2 7 10 1
第六次:2 9 5 6 8 3 4 7 10 1
。。。:(沒有交換)
第十次:1 9 5 6 8 3 4 7 10 2
可以看出,原來較小的數是在前面的,經過一輪的交換後放到後面了
那麼怎樣解決這個不足呢?可以使用
氣泡排序
什麼是氣泡排序呢?
你可以這樣理解:(從小到大排序)存在10個不同大小的氣泡,由底至上地把較少的氣泡逐步地向上公升,這樣經過遍歷一次後,最小的氣泡就會被上公升到頂(下標為0),然後再從底至上地這樣公升,迴圈直至十個氣泡大小有序。 在
氣泡排序中,最重要的思想是兩兩比較,將兩者較少的公升上去
氣泡排序最壞情況的時間複雜度是o(n²)
**:
#include
void
swap
(int *a, int *b)
;int
main
(); int i, j; for (i = 0; i < 10; i++) } } for (i = 0; i < 10; i++) return
0;}void
swap
(int *a, int *b)
氣泡排序演算法只會將較少的逐步向上推,不會造成文章前面所說的不足,這裡就不給予演示。
有些追求完美的人就會思考,氣泡排序能不能優化呢?
答案是能的。如何優化的文章在
這裡。
排序演算法入門之氣泡排序
在開發中,對一組資料進行有序地排列是經常需要做的事情,所以掌握幾種甚至更多的排序演算法是絕對有必要的 本文章介紹的是排序演算法中較簡單的一種演算法 氣泡排序 題外話 在深入學習更多排序演算法後和在實際使用情況中,氣泡排序的使用還是極少的。它適合資料規模很小的時候,而且它的效率也比較低,但是作為入門的...
排序演算法入門之氣泡排序
在開發中,對一組資料進行有序地排列是經常需要做的事情,所以掌握幾種甚至更多的排序演算法是絕對有必要的 本文章介紹的是排序演算法中較簡單的一種演算法 氣泡排序 題外話 在深入學習更多排序演算法後和在實際使用情況中,氣泡排序的使用還是極少的。它適合資料規模很小的時候,而且它的效率也比較低,但是作為入門的...
排序演算法入門之氣泡排序優化
先來說說,氣泡排序哪些地方需要優化 那麼如何優化?通過觀察可以看到,造成沒必要的操作主要原因是後面8個數的順序都已經是有序。所以,我們可以通過設定乙個標記變數,標記數列中的數是否在迴圈結束前就已經排好序 include void swap int a,int b int main int i,j i...