氣泡排序是一種基於比較的簡單的演算法,這種演算法越大的元素會越來越靠近數列的頂端,就像汽水裡面的氣泡一樣往上冒,因此得名為氣泡排序。
首先遍歷陣列,比較相鄰兩個元素的大小,如果第乙個元素比第二個元素要大則交換兩個元素的位置,這樣遍歷完一輪後最大的元素就到了末尾。重複上面的步驟,只不過因為上一輪遍歷後上一輪中最大的元素已經到了末尾,所以不需要比較該元素,即每一次遍歷的長度減 1,直到遍歷長度為 1 為止。
假如有乙個這樣的陣列:,根據上面的思想,它氣泡排序的過程是這樣的:
}system.out.println("第" + (i + 1) + "次比較後" + "origin--->" + arrays.tostring(origin));
}system.out.println("index--->" + index);
system.out.println("sortedarray--->" + arrays.tostring(origin));
return origin;
}使用測試**執行一遍:
@test
public void testbubblesort1()
int intarray = new int ;
bubblesort1(intarray);
}
執行結果如下:
從上面的列印中我們可以看出,在第 3 次比較完成後陣列其實已經是有序的了,但是後面還進行了 6 次比較,這顯然是多餘的,所有這些多餘的比較我們是可以優化掉一大部分的。在內迴圈開始前設定乙個標誌位,如果內迴圈中有元素的交換,則改變標誌位的值,那麼如果內迴圈遍歷完標誌位都沒有改變,則說明已經排序完成,跳出迴圈,避免掉後面多餘的比較。當然,在上面的示例中雖然從第 4 次到第 9 次都是多餘的,但是我們得依靠第 4 次的迴圈來判斷是否已經排序完成,所以第 4 次比較是省略不掉的,只能省略第 5 次到第 9 次。
**如下:
public static int bubblesort2(int origin) ;
}system.out.println("origin--->" + arrays.tostring(origin));
int index = 0;
for (int i = 0; i < origin.length - 1; i++)
index++;
}system.out.println(
"第" + (i + 1) + "次比較後" + "origin--->" + arrays.tostring(origin) + ",issorted--->" + issorted);
//如果內迴圈結束後標誌位仍為 true,則說明已經排序完成,則可以跳出外迴圈,省略後面多餘的比較
if (issorted)
}system.out.println("index--->" + index);
system.out.println("sortedarray--->" + arrays.tostring(origin));
return origin;
}
列印結果如下,可以看到只有前面 4 次迴圈,也就是比較 9+8+7+6=30 次。
同樣從上面的列印中我們可以看到,在第 1 次比較後,後面的 4、5、6、7、8、9 就已經是有序的了,後面再來比較這後面的部分它還是不會改變元素的位置,所以第 2 次比較的時候,元素 4,也就是下標為 4 的元素及後面的元素就沒有比較的必要了,我們可以記錄一下上次比較到**(如記錄為下標 n)就停止了,也就是從 n 開始後面的元素就已經是有序的了,下次內迴圈就到這裡就可以了,不用再比較後面的元素。
所以我們需要修改一下內迴圈的部分:
public static int bubblesort(int origin) ;
}system.out.println("origin--->" + arrays.tostring(origin));
// 記錄最後一次交換的位置
int lastexchangeindex = 0;
// 無序數列的邊界,每次比較只需要比到這裡為止
int sortborder = origin.length - 1;
int index = 0;
for (int i = 0; i < origin.length - 1; i++)
index++;
}system.out.println("第" + (i + 1) + "次比較後" + "origin--->" + arrays.tostring(origin) + ",issorted--->"
+ issorted + ",sortborder--->" + sortborder + ",lastexchangeindex--->" + lastexchangeindex + ",index--->" + index);
sortborder = lastexchangeindex;
if (issorted)
}system.out.println("index--->" + index);
system.out.println("sortedarray--->" + arrays.tostring(origin));
return origin;
}
執行結果如下:
可以看到同乙個陣列,在氣泡排序經過優化後,比較次數減少至三分之一,當然這只是個例不能說明全部,但是這說明優化是很有必要的。
假設原始陣列長度為 n,則外迴圈 n 次,每次遍歷巢狀乙個內迴圈,所以時間複雜度為 o(n²)。
氣泡排序只用到迴圈,臨時變數所佔空間不隨原始陣列的長度改變而改變,所以空間複雜度為 o(1)。
1.氣泡排序適用於小數和整數,實現簡單,空間複雜度低,並且屬於穩定排序。
1.氣泡排序效率並不高,每次只能移動相鄰兩個資料,時間複雜度最高達到 o(n²)。
排序演算法之氣泡排序
參考 氣泡排序演算法的運作如下 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。若...
排序演算法之氣泡排序
對於大多數學計算機的人來說,氣泡排序應該都是接觸的第一種排序方式,氣泡排序的排序思想是比較簡單的,它的演算法的是 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了...
排序演算法之氣泡排序
氣泡排序 bubble sort 是一種電腦科學領域的較簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越大的元素會經由交換慢慢 浮 到數列的頂端,...