Java數組之冒泡排序


學習Demo

 

冒泡排序【重點:閉着眼睛都應該會寫】

  1. 冒泡排序無疑是最為出名的排序算法之一,總共有八大排序。

  2. 兩層循環,外層冒泡輪數,里層依次比較,江湖中人盡皆知。

  3. 由於嵌套循環,冒泡排序的時間復雜度高:O(n2)

思考:如何優化?

如果數組中的幾個數已經排好序了,就沒必要再去全部比較一輪了

 

 

碼上行動

 

package array;

import java.util.Arrays;

/**
 * 冒泡排序【重點:閉着眼睛都應該會寫】
 * 冒泡排序無疑是最為出名的排序算法之一,總共有八大排序。
 * 兩層循環,外層冒泡輪數,里層依次比較,江湖中人盡皆知。
 * 由於嵌套循環,冒泡排序的時間復雜度高:O(n2)
 *
 * 思考:如何優化?
 * 如果數組中的幾個數已經排好序了,就沒必要再去全部比較一輪了
 */
public class ArrayDemo5 {

    public static void main(String[] args) {

        //定義數組
        int[] a = {1,4,5,6,72,2,2,2,25,6,7};

        //調用排序方法,返回排序后的數組
        int[] sort = sort(a);

        //輸出排序后的數組
        System.out.println(Arrays.toString(sort));
    }

    /*
        冒泡排序:
        1. 比較數組中,兩個相鄰的元素,如果第一個數比第二個數大,我們就交換他們的位置
        2. 每一次比較,都會產生出一個最大或者最小的數字
        3. 下一輪則可以少一次排序
        4. 依次循環,直到結束
     */
    public static int[] sort(int[] array){
        //臨時變量 用來交換位置
        int temp = 0;

        //外層循環,判斷我們這個要走多少次
        for (int i = 0; i < array.length -1; i++) {

            //小小優化:通過flag標識位減少沒有意義的比較
            boolean flag = false;

            //內層循環,比較判斷兩個數,如果第一個數比第二個數大,則交換位置(小數在前,大數在后,從小到大)
            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j + 1] > array[j]) { //此處從大到小排序(大數在前,小數在后),如果實現從小到大,只需要將 ">" 改為 "<" (小數在前,大數在后)
                    temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                    //只要排序一次(存在交換),則給flag賦值為true
                    flag = true;
                }
            }
            //如果flag為false,說明沒有排序(不存在交換,已經有序),則break跳出(減少沒必要的排序,優化排序次數,降低時間成本)
            if (flag == false) {
                break;
            }
        }
        return array;
    }

}
 


免責聲明!

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



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