java實現氣泡排序-通俗易懂
自己寫的筆記可能有不對的地方,希望大佬指正!
先說思路假設有一個數組是arr = [24, 69, 80, 57, 13]
,分別對應的下標是[0, 1, 2, 3, 4]
現在需要把最大的數字放在最後面,就排序成[13, 24, 57, 69, 80]
,看樣子非常簡單。
那麼進行第一次排序,24和69排序,下標0對應的是24,和下標1對應的69進行比較。
小的放在左邊,大的放在右邊,那麼這裡就不變,這裡直接舉例子80和57的位置。
80對應的下標是2,57對應的下標是3,現在80比57大所以需要把57變換到80的位置也就是下標變化。
所以需要做的就是把2的下標80變成57,3的下標57變成80就進行了一次交換。
然後就變成了80和13的交換,80比13大,首先80現在的下標是3,13的下標是4。
那麼就需要把4的下標13變成80,3的下標80變成13就可以進行了交換,如下交換流程。
從左到右比較
第一輪比較:目標大的放在最後面
第一次比較[24, 69, 80, 57, 13]
第二次比較[24, 69, 80, 57, 13]
第三次比較[24,69,57,80,13]
第四次比較[24, 69, 57, 13, 80]
第二輪比較:目標把第二大的數放在倒數第二的位置
第一次比較[24, 69, 57, 13, 80]
第二次比較[24, 57, 69, 13, 80]
第三次比較[24, 57, 13, 69, 80]
第三輪比較:目標把第三大的數放在倒數第三的位置
第一次比較[24, 57, 13, 69, 80]
第二次比較[24, 13, 57, 69, 80]
第四輪比較:目標把第四大的數放在倒數第四的位置
第一次比較[13, 24, 57, 69, 80]
到這裡可以發現進行了四輪比較,每一輪比較裡面還有比較數字的操作,這裡可以簡單進行程式碼,如下圖就實現了第一輪迴圈,輸出是
24 69 57 13 80
,如果我們需要進行第二輪比較只需要把迴圈的 j < 4變成 j < 3即可
package chapter6.氣泡排序; public class maopao { public static void main(String[] args) { int arr[] = {24, 69, 80, 57, 13}; //定義temp變數 int temp = 0; for (int j = 0; j < 4; j++) { //假設這裡是第一次迴圈j為0那麼就判斷的是arr[0] > arr[1] //也就是判斷24 > 69 if (arr[j] > arr[j + 1]) { //進行轉換操作,稍微看看還是能看懂的因為進行兩個數字轉換 //需要用到變數 temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } //輸出每次交換過後的數字 for (int j = 0; j < arr.length; j++) { System.out.print(arr[j] + "\t"); } //每次輸出完之後換行 System.out.println(); } }
如果要實現第二輪就可以直接把第一輪的程式碼再複製一遍即可,但是太麻煩了,所以這裡就需要用到二層迴圈,因為有四輪迴圈,所以程式碼如下,就已經實現了程式碼,但是現在需要把程式碼變活,萬一陣列變了怎麼辦。
package chapter6.氣泡排序;
public class maopao {
public static void main(String[] args) {
int arr[] = {24, 69, 80, 57, 13};
//定義temp變數
int temp = 0;
//增加外層迴圈,因為有四輪迴圈所以迴圈四次
for (int i = 0; i < 4; i++) {
/*
* 每次迴圈完成之後需要減去一個1
* 因為第第一輪比較已經比較完成,也就是第一個最大的數已經出來了
* 就需要第二個最大的數字,就所以減去一個1,但是第一次迴圈的時候
* 時候不需要減去,所以就減去0即可
*
* */
for (int j = 0; j < 4 - i; j++) {
//假設這裡是第一次迴圈j為0那麼就判斷的是arr[0] > arr[1]
//也就是判斷24 > 69
if (arr[j] > arr[j + 1]) {
//進行轉換操作,稍微看看還是能看懂的因為進行兩個數字轉換
//需要用到變數
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
//輸出每次交換過後的數字
for (int j = 0; j < arr.length; j++) {
System.out.print(arr[j] + "\t");
}
//每次輸出完之後換行
System.out.println();
}
}
}
修改程式碼如下。
package chapter6.氣泡排序;
public class maopao {
public static void main(String[] args) {
int arr[] = {24, 69, 80, 57, 13};
//定義temp變數
int temp = 0;
//增加外層迴圈,因為有四輪迴圈所以迴圈四次
/*
* 這裡四次可以發現是陣列長度減1
* 可以把i < 4修改為 i < i < arr.length - 1
*
* */
for (int i = 0; i < arr.length - 1; i++) {
/*
* 每次迴圈完成之後需要減去一個1
* 因為第第一輪比較已經比較完成,也就是第一個最大的數已經出來了
* 就需要第二個最大的數字,就所以減去一個1,但是第一次迴圈的時候
* 時候不需要減去,所以就減去0即可
*
* */
/*
* 這裡四次和上面一樣
*
* */
for (int j = 0; j < arr.length - 1 - i; j++) {
//假設這裡是第一次迴圈j為0那麼就判斷的是arr[0] > arr[1]
//也就是判斷24 > 69
if (arr[j] > arr[j + 1]) {
//進行轉換操作,稍微看看還是能看懂的因為進行兩個數字轉換
//需要用到變數
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.print("======第"+(i + 1)+"輪比較======" + "\n");
//輸出每次交換過後的數字
for (int j = 0; j < arr.length; j++) {
System.out.print(arr[j] + "\t");
}
//每次輸出完之後換行
System.out.println();
}
}
}