1. 程式人生 > >資料結構與演算法-氣泡排序

資料結構與演算法-氣泡排序

概覽

基本概念

氣泡排序(Bubble Sort)一種交換排序,它的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。

java程式碼實現

//申明待排序陣列
int[] a = {9,1,5,8,3,7,4,6,2};
for (int i = 0; i < a.length; i++) {
     for
(int j = a.length-1; j > i; j--) { /* 注意j是從後往前迴圈 */ if (a[j-1] > a[j]) { /* 若前者大於後者,交換之 */ int temp = a[j-1]; a[j-1] = a[j]; a[j] = temp; } } }

圖示執行過程

進一步優化

  • 如果我們待排序的序列是{2,1,3,4,5,6,7,8,9},也就是說,除了第一和第二的關鍵字需要交換外,別的都已經是正常的順序。當i=1時,交換了2和1,此時序列已經有序,但是演算法仍然不依不饒地將i=2到9以及每個迴圈中j迴圈都執行一遍,儘管並沒有交換資料,但是之後的大量比較還是大大地多餘了。

  • 設定flag標記,及時退出迴圈

//申明待排序陣列
int[] a = {9,1,5,8,3,7,4,6,2};
boolean flag = true;	/* flag用來作為標記 */
for (int i = 0; i < a.length && flag; i++) { /* 若flag為false則退出迴圈 */
	flag = false; /* 初始為false */
	for (int j = a.length-1; j > i; j--) {
 		if (a[j-1] > a[j]) {
			int temp = a[j-1];
			a[
j-1] = a[j]; a[j] = temp; flag = true; /* 如果有資料交換,則flag為true */ } } }

時間複雜度分析

  • 最好的情況,也就是待排序的表本身就是有序的,那麼根據優化後的程式碼可以推斷出就是n-1次比較,沒有資料交換,時間複雜度為O(n);
  • 最壞的情況,也就是待排序表是逆序的,此時需要比較1+2+3+···+(n-1) = n(n-1)/2次,並作等數量級的記錄移動,時間複雜度為O(n2);
  • 因此,總的時間複雜度為O(n2)。