9. 氣泡排序,以及如何優化氣泡排序,氣泡排序屬於插入排序

乖乖虎學Java發表於2020-10-07
  • 每進行一次氣泡排序,就把最大的數放在最後面
  • 這樣下一次排序,就可以少進行一次比較
  • n個數,就需要排序n-1次
  • 優化氣泡排序,如果有一次一個變數的順序也沒有改變,那麼直接結束這次迴圈即可
package com.qin.sort;

import java.lang.reflect.Array;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

//氣泡排序
public class BubbleSort {

    public static void main(String[] args) {

        int arr[] = {3,9,-1,10,20};
        int arr1[] = {3,9,-1,10,20};
        int arr2[] = {3,9,-1,10,20};
        //為了容易理解,我們把氣泡排序的演變過程,給大家展示

        //1. 第一趟排序,就是為了把最大的數排在最後面
        int temp = 0 ; //臨時變數
        for (int i = 0; i < arr.length-1; i++) {
            if (arr[i]>arr[i+1]){  //前面的數比後面的數大
                temp = arr[i+1];  //前面的數和後面的數進行交換
                arr[i+1] = arr[i];
                arr[i] = temp;
            }
        }
        System.out.println("第一次排序完成後的陣列");
        System.out.println(Arrays.toString(arr));

        //第二趟排序,就是把第二大的數排在倒數第二位
        for (int i = 0; i < arr.length-1-1; i++) {
            if (arr[i]>arr[i+1]){  //前面的數比後面的數大
                temp = arr[i+1];  //前面的數和後面的數進行交換
                arr[i+1] = arr[i];
                arr[i] = temp;
            }
        }
        System.out.println("第二次排序完成後的陣列");
        System.out.println(Arrays.toString(arr));


        //第三趟排序,就是把第三大的數排在倒數第三位
        for (int i = 0; i < arr1.length-1-1-1; i++) {
            if (arr[i]>arr[i+1]){  //前面的數比後面的數大
                temp = arr[i+1];  //前面的數和後面的數進行交換
                arr[i+1] = arr[i];
                arr[i] = temp;
            }
        }
        System.out.println("第三次排序完成後的陣列");
        System.out.println(Arrays.toString(arr));


        //第四趟排序,就是把第四大的數排在倒數第四位
        for (int i = 0; i < arr1.length-1-3; i++) {
            if (arr[i]>arr[i+1]){  //前面的數比後面的數大
                temp = arr[i+1];  //前面的數和後面的數進行交換
                arr[i+1] = arr[i];
                arr[i] = temp;
            }
        }
        System.out.println("第四次排序完成後的陣列");
        System.out.println(Arrays.toString(arr));


        System.out.println("=============================");

        //完整的氣泡排序 的時間複雜度 n^2
        boolean flag = false; //標識變數,表示是否進行交換
        for (int i = 0; i < arr1.length-1; i++) {
            for (int j = 0; j < arr1.length-1-i ; j++) {
                if (arr1[j]>arr1[j+1]){  //前面的數比後面的數大
                    flag = true;
                    temp = arr1[j+1];  //前面的數和後面的數進行交換
                    arr1[j+1] = arr1[j];
                    arr1[j] = temp;
                }
            }
            System.out.printf("第%d排序後",i+1);
            System.out.println(Arrays.toString(arr1));
            if (!flag){ //在一趟排序中,一次交換都沒有發生過
                break;
            }else {
                flag = false; //重置flag,方便進行下次判斷
            }
        }

        System.out.println("====================");
        //測試封裝後的方法
        bubbleSort(arr2);
        System.out.println("排序後");
        System.out.println(Arrays.toString(arr2));

        System.out.println("大規模測試");
        //測試一下氣泡排序的速度,給80000個資料測試
        //建立要給80000個的隨機的陣列
        int [] arr4 = new int [80000];
        for (int i = 0 ; i < 80000 ; i++){
            arr4[i] = (int)(Math.random() * 80000000);//生成[0,80000000)的隨機數
        }

        Date date1 = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date1Str = simpleDateFormat.format(date1);
        System.out.println("排序前的時間是:"+date1Str);
        bubbleSort(arr4);
        Date date2 = new Date();
        String date2Str = simpleDateFormat.format(date2);
        System.out.println("排序後的時間是:"+date2Str);


    }

    //將氣泡排序封裝為一個方法
    public static void bubbleSort(int [] arr1){

        int temp = 0 ; //臨時變數
        //完整的氣泡排序 的時間複雜度 n^2
        boolean flag = false; //標識變數,表示是否進行交換
        for (int i = 0; i < arr1.length-1; i++) {
            for (int j = 0; j < arr1.length-1-i ; j++) {
                if (arr1[j]>arr1[j+1]){  //前面的數比後面的數大
                    flag = true;
                    temp = arr1[j+1];  //前面的數和後面的數進行交換
                    arr1[j+1] = arr1[j];
                    arr1[j] = temp;
                }
            }
            if (!flag){ //在一趟排序中,一次交換都沒有發生過
                break;
            }else {
                flag = false; //重置flag,進行下次判斷
            }
        }
    }



}

  • 結果

在這裡插入圖片描述

相關文章