經典氣泡排序的分析、優化及測試

無聲---發表於2020-10-03

經典氣泡排序的分析、優化及測試

1.氣泡排序的過程

int arr[] = {3,9,-1,-10,-2};

假設對arr這個陣列進行排序,
第一輪:
(1)3和9進行比較,3不大於9,3和9的位置不交換
(2)9和-1進行比較,9大於-1,9和-1交換位置,陣列變為

{3,-1,9,-10,-2}

(3)9和-10進行比較,9大於-10,9和-10交換位置,陣列變為

{3,-1,-10,9,-2}

(4)9和-2進行比較,9大於-2,9和-2交換位置,陣列變為

{3,-1,-10,-2,9}

通過這一段流程可以得出兩點:
1.氣泡排序時,是拿陣列的每一個元素與這個元素的下一個元素進行比較,如果這個元素比下一個元素大,就交換位置,否則就再進行判斷。
2.這一輪排序的使得這個陣列中最大的數排在了陣列的在最後一個位置,這一點很重要。
第二輪:
和第一輪同樣的方法,但是比較的次數少了一次,因為我們已經排出最大的數了,所以第二輪,可以排序出第二大的數,結果如下

{-1,-10,-2,3,9}


最多進行5輪排序,就可以將陣列排序好。

2.程式碼實現

package test1;

import java.util.Random;

/**
 * 氣泡排序
 */
public class BubbleSort {
    public static void main(String[] args) {
        //int arr[] = {3,9,-1,-10,-2};
        int arr[] = new int[80000];
        //產生8萬條隨機數
        for (int i = 0; i < 80000; i++) {
            arr[i]= new Random().nextInt(80000);
        }
        long before = System.currentTimeMillis();
        bubbleSort(arr);
        long after = System.currentTimeMillis();
        System.out.println((after-before)/1000);
    }
    public static int[] bubbleSort(int[] arr){
        boolean flag = false;
        for (int i = 0; i < arr.length; i++) {
            int temp = 0;
            for (int j = 1; j < arr.length-i; j++) {
                if (arr[j-1]>arr[j]){
                    temp = arr[j-1];
                    arr[j-1] = arr[j];
                    arr[j] = temp;
                    flag = true;
                }
            }
            //System.out.println(Arrays.toString(arr));
            //如果已經排好序,就退出,不再進行判斷
            if (!flag){
                break;
            }else {
                flag = false;
            }
        }
        return arr;
    }
}

3.氣泡排序的優化

可以設想會有這樣一種情況,一共進行5輪排序,但是在第三輪的時候就陣列就已經排好序了,例如:

{5,4,1,2,3}

第三輪就已經排好序就無需繼續再進行比較,直接退出迴圈即可。
flag預設為false

 //如果已經排好序,就退出,不再進行判斷
            if (!flag){
                break;
            }else {
                flag = false;
            }

4.氣泡排序測試

將上面的程式碼執行之~
在這裡插入圖片描述
我的電腦測試了大約需要8秒的時間,順嘴提一句氣泡排序的時間複雜度時O(n^2)

相關文章