1. 程式人生 > 其它 >Java陣列04--氣泡排序

Java陣列04--氣泡排序

Java陣列04--氣泡排序

氣泡排序

  • 氣泡排序無疑是最為出名的排序演算法之一,總共有八大排序!
  • 冒泡的程式碼還是相當簡單的,兩層迴圈,外層冒泡輪數,裡層依次比較,江湖中人人盡皆知。

    • 1、比較陣列中,兩個相鄰的元素,如果第一個數比第二個數大,我們就交換他們的位置
    • 2、每一次比較,都會產生出一個最大,或者最小的數字;
    • 3、下一輪,則可以少一次排序
    • 4、一次迴圈,直到結束!
  • 我們看到巢狀迴圈,應該立馬就可以得出這個演算法的時間複雜度為O(n2)。

  • 氣泡排序程式碼

    package com.studyhao1999.Array;
    
    import java.util.Arrays;
    
    public class ArrayDemo07 {
        public static void main(String[] args) {
            int[] a={231,112,12321,321,3232};
            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++) {
                //內層迴圈:比較判斷兩個數,如果第一個數,比第二個數大,則交換位置 
                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;
                    }
                    
                }
    
            }
            return array;
        }
    }
    

    程式執行結果:

  • 思考:如何優化?

  • 通過flag標識位減少沒有意義的比較

package com.studyhao1999.Array;

import java.util.Arrays;

public class ArrayDemo07 {
    public static void main(String[] args) {
        int[] a={231,112,12321,321,3232};
        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++) {
            boolean flag=false;//通過flag標識位減少沒有意義的比較
            //內層迴圈:比較判斷兩個數,如果第一個數,比第二個數大,則交換位置 
            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;
                }
            }
            if (flag==false){
                break;
            }
        }
        return array;
    }
}

程式執行結果: