Java冒泡排序


Java冒泡排序

算法思想:

每一次循環結束之后,都要找出最大的數據,放到參與比較的這堆數據的最右邊。(冒出最大的那個氣泡。)(此輪找出最大的數據下一輪不參與比較!)

 

核心

拿着左邊的數字和右邊的數字比對,當左邊 > 右邊的時候,交換位置。

 

算法步驟:

比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。這步做完后,最后的元素會是最大的數。

針對所有的元素重復以上的步驟,除了最后一個。

持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。

 

代碼

 for(int i = arr.length - 1; i > 0; i--){
  for(int j = 0; j < i; j++){
    if(arr[j] > arr[j + 1]){
      // 交換位置。
      // arr[j] 和 arr[j+1] 交換
      int temp = arr[j];
      arr[j] = arr[j + 1];
      arr[j + 1] = temp;
    }
  }
 }

比較次數:(n(n + 1)) / 2

 

過程

參與比較的數據:9 8 10 7 6 0 11

第1次循環:

8 9 10 7 6 0 11 (第1次比較:交換)

8 9 10 7 6 0 11 (第2次比較:不交換)

8 9 7 10 6 0 11 (第3次比較:交換)

8 9 7 6 10 0 11 (第4次比較:交換)

8 9 7 6 0 10 11 (第5次比較:交換)

8 9 7 6 0 10 11 (第6次比較:不交換)

最終冒出的最大數據在右邊:11

 

參與比較的數據:8 9 7 6 0 10

第2次循環:

8 9 7 6 0 10(第1次比較:不交換)

8 7 9 6 0 10(第2次比較:交換)

8 7 6 9 0 10(第3次比較:交換)

8 7 6 0 9 10(第4次比較:交換)

8 7 6 0 9 10(第5次比較:不交換)

 

參與比較的數據:8 7 6 0 9

第3次循環:

7 8 6 0 9(第1次比較:交換)

7 6 8 0 9(第2次比較:交換)

7 6 0 8 9(第3次比較:交換)

7 6 0 8 9(第4次比較:不交換)

 

參與比較的數據:7 6 0 8

第4次循環:

6 7 0 8(第1次比較:交換)

6 0 7 8(第2次比較:交換)

6 0 7 8(第3次比較:不交換)

 

參與比較的數據:6 0 7

第5次循環:

0 6 7(第1次比較:交換)

0 6 7(第2次比較:不交換)

 

參與比較的數據:0 6

第6次循環:

0 6 (第1次比較:不交換)

循環次數:n - 1

 

冒泡排序還有一種優化算法,就是立一個 flag,當在一趟序列遍歷中元素沒有發生交換,則證明該序列已經有序。但這種改進對於提升性能來說並沒有什么太大作用。

代碼

 for(int i = arr.length - 1; i > 0; i--){
    int flag = 0;//將flag初始置為0
  for(int j = 0; j < i; j++){
  if(arr[j] > arr[j + 1]){
  // 交換位置。
            // arr[j] 和 arr[j+1] 交換
            int temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
            flag = 1;//發生交換將flag置為1
        }
      }
    if(flag == 0) break;//flag為0表示本輪沒有元素發生交換,證明已經排好序了,直接跳出循環
 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM