冒泡排序(Bubble Sort)
冒泡排序也叫起泡排序
冒泡排序的執行流程
1.從頭開始比較每一對相鄰元素,如果第一個比第二個大,就交換他們的位置。(執行完第一輪,最後的那個元素就是最大的元素)
2.忽略從步驟1中找到的那個最大元素,然後重複執行步驟1,直到元素有序
來看代碼:
public int[] bubbleSort(int[] array ){
for (int end = array.length; end > 0; end--) {
for (int begin = 1 ; begin<end ; begin++) {
if(array[begin]<array[begin-1]) {
int index = array[begin];
array[begin]=array[begin-1];
array[begin-1] = index;
}
}
}
return array;
}
調用一下試試
public static void main(String[] args) {
BubbleSort b = new BubbleSort();
int[] array = {9,8,7,4,5,6,1,2,3};
System.out.println("排序前");
for (int i = 0; i < array.length; i++) {
if(i!=0) System.out.print(" ");
System.out.print(array[i]);
}
b.bubbleSort(array);
System.out.println("\n排序後");
for (int i = 0; i < array.length; i++) {
if(i!=0) System.out.print(" ");
System.out.print(array[i]);
}
}
運行結果:
排序前
9 8 7 4 5 6 1 2 3
排序後
1 2 3 4 5 6 7 8 9
這是冒泡排序的最簡單的形式,下面我們來給他優化一下。
優化冒泡排序1
優化方案: 如果序列已經完全有序,可以提前終止排序
來看代碼:
public int[] bubbleSort(int[] array ){
for (int end = array.length; end > 0; end--) {
boolean b = true;
for (int begin = 1 ; begin<end ; begin++) {
if(array[begin]<array[begin-1]) {
int index = array[begin];
array[begin]=array[begin-1];
array[begin-1] = index;
b = false;
}
if (b) break;
}
}
return array;
}
優化代碼和未優化的代碼的區別就是,優化代碼添加了一個boolean類型,用來判斷如果在for循環一圈後,都沒有觸動if語句,說明這個數組已經不需要排序了。然後直接結束排序。
當然這個排序還是可以有另外一種優化方式
優化冒泡排序2
優化方案: 如果序列已經局部有序,可以記錄最後一次交換的位置,減少交換次數。
來看代碼:
public int[] bubbleSort(int[] array ){
for (int end = array.length; end > 0; end--) {
int j = 1;
for (int begin = 1 ; begin<end ; begin++) {
if(array[begin]<array[begin-1]) {
int index = array[begin];
array[begin]=array[begin-1];
array[begin-1] = index;
j = begin;
}
end = j;
}
}
return array;
}
優化代碼和未優化的代碼的區別就是,優化代碼添加了一個int類型,用來判記錄最後交換的位置,然後直接可以讓索引指向這個位置,下一次在進行循環可以直接從這個位置作爲應該索引,這個位置後面的元素就可以不去遍歷。
冒泡排序屬於穩定排序,爲原地算法
注:本文博主學習自騰訊課堂的小碼哥的“數據結構與算法”,所以如有和小碼哥課程中類似方案,純屬必然!!!