氣泡排序是最為常用的一種排序方法。他是一類具有「交換」性質的排序方法。氣泡排序的基本思想可描述如下:
將序列的第1個元素與第2個元素進行比較,若前者大於後者,則將第1個元素與第2個元素進行位置交換,否則不交換。
再將第2個元素與第3個元素進行比較,同樣若前者大於後者,則將第2個元素與第3個元素進行位置交換,否則不交換。
依此類推,直到將第n-1個元素與第n個元素進行比較為止。
這個過程稱為第1趟氣泡排序。經過第1趟氣泡排序後,將長度為n的序列中的最大值置於了序列的尾部,即第n個位置上。
然後再對剩下的n-1個元素作同樣的操作,這叫做第2趟氣泡排序。經過第2趟的氣泡排序,將剩下的n-1個元素中最大的元素置於了序列的n-1的位置上。
如此進行下去,當執行完第n-1趟的氣泡排序後,就可以將序列中剩下的2個元素中最大的元素置於了序列的第2個位置上。第1個位置上的元素就是該序列中最小的元素。這樣氣泡排序完成。
元素序列的氣泡排序的過程如下:
初始狀態:
↓比較6次
第1趟排序:
↓比較5次
第2趟排序:
↓比較4次
第3趟排序:
↓比較3次
第4趟排序:
↓比較2次
第5趟排序:
↓比較1次
第6趟排序:
如圖所示,乙個包含了n個元素的序列要進行n-1趟的氣泡排序,第i趟氣泡排序將第1–n-i+1個元素中最大的元素交換到第n-i+1的位置上。因此第n-1趟氣泡排序就是將1–2個元素中最大的元素交換到第2個位置上。因此,這種排序的方法就是通過序列中鄰接元素之間的交換,使較小的元素逐步從序列的後端移到序列的前端,使較大的元素從序列的前端移到後端。這就像水底的氣泡不斷向上「冒」一樣,因此形象地稱這種排序方法為「氣泡排序」法。
氣泡排序的演算法描述如下:
void sort(keytype k,int n)
}}}
該演算法仍然只對資料進行從小到大的排序。k的0號單元不存放內容,因此也可以省略中間變數tmp,而用k[0]作為資料交換到臨時緩衝區。
但是上述的冒泡演算法不是乙個優秀的氣泡排序演算法。因為上述氣泡排序的過程中,從第4趟開始,序列本身就沒有再發生變化,只是相鄰元素的比較,並沒有發生相鄰元素的交換。因此,從第4趟排序操作往下的比較運算其實都可以不再進行。如果某一趟排序過程中只有元素之間的比較操作,而沒有發生元素的位置交換,那就說明到本趟排序為止,序列中的元素已經有序,因此不需要再進行下一趟排序,排序可以提前結束。可以對原來的氣泡排序法進行改造,使其排序效率更高。
在演算法中可以設定乙個標識變數flag。規定當flag=1時,說明本趟排序中仍有元素交換的過程,因此還需進行下一趟的比較。當flag=0時,說明本趟排序中已經沒有了元素的交換,只有元素的比較,因此表明該序列已經按值有序,排序可以停止。
改進後的氣泡排序演算法如下:
void sort(keytype k,int n)
}}}
使用改進後的演算法可以減少排序時的比較次數,提高氣泡排序的效率。
【例項】
編寫乙個c程式,實現資料序列的氣泡排序,要求從大到小,並輸出排序後的數列元素。
【分析】
該資料序列包含10個元素,因此可以將它放到乙個含有11個單元的陣列中,第0號元素作為存放每次待插入的元素k[i]的空間,在這裡不能直接照搬前面給出的演算法,要將前面實現從小到大排列的演算法加以修改,從而達到從大到小排列的目的。
#includevoid sort(int k,int n)//氣泡排序
}}}
main()
; //初始化序列,a[0]可任意置數
printf("原序列為:\n");//顯示原序列之中的元素
for(i=1;i<=10;i++)
printf("%d ",a[i]);
sort(a,10);//執行氣泡排序
printf("\n排序後的序列為:\n");
for(i=1;i<=10;i++)
printf("%d ",a[i]); //輸出排序後結果
return 0;
}
氣泡排序 排序 氣泡排序
既然寫了計組思來想去便打算把資料結構也寫下來,寫的時候總是發現看的時候無法發現的問題,受益良多。交換排序的基本思想 exchange until sorted 順序,分支,迴圈 注意偽 的熟悉 下面介紹兩種交換演算法 首先進行聯想,用乙個圖進行輔助聯想 水冒泡過程 頂部是陣列的begin,底部理解為...
氣泡排序 氣泡排序法
冒泡法是一種簡單的排序方法,它的實現非常簡單。首先對n個專案進行掃瞄,比較相領兩個專案的大小,若發現違背大小次序則進行互換,由此可以使n個專案中的最大者換到最後。然後對剩下的未排序好的專案再進行掃瞄,使它們的最大者換到表的最後。以此類推,直到將表全部排序好為止。這種排序方法,每遍掃瞄以後,都縮短了待...
排序 氣泡排序
氣泡排序 氣泡排序 bubble sort 是一種 電腦科學 領域的較簡單的 排序演算法 它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。原理是臨近的數字兩兩進行比較,按照從小到大或者從大到小...