欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java排序算法之冒泡排序的原理及優(yōu)化

 更新時間:2023年11月14日 10:26:35   作者:Cyuujie  
這篇文章主要介紹了Java排序算法之冒泡排序的原理及優(yōu)化,冒泡排序的思想很簡單,遍歷數(shù)組,比較相鄰的兩個元素,順序錯誤就把它們交換,直到整個數(shù)組排序完成,因為每經(jīng)過一趟排序,越小的元素會經(jīng)交換而慢慢“浮”到數(shù)列的頂端,因此叫做冒泡排序,需要的朋友可以參考下

冒泡排序原理

冒泡排序的思想很簡單:遍歷數(shù)組,比較相鄰的兩個元素,順序錯誤就把它們交換,直到整個數(shù)組排序完成。因為每經(jīng)過一趟排序,越小的元素會經(jīng)交換而慢慢“浮”到數(shù)列的頂端,因此叫做冒泡排序。

在這里插入圖片描述

假設(shè)我們現(xiàn)在要對數(shù)組:arr= {3,9,-1,10,-2,5,21} 進行排序,結(jié)合上面的動圖,經(jīng)過第一趟排序后最大的元素會被排到最后。

第一趟排序

public int[] OneStepBubbleSort(int arr[]){
    int temp = 0;
    for (int i = 0; i < arr.length - 1; i++){
        if (arr[i] > arr[i + 1]){
            temp = arr[i];
            arr[i] =  arr[i + 1];
            arr[i + 1] = temp;
        }
    }
    System.out.print("第1趟排序完成:");
    System.out.println(Arrays.toString(arr));
    return arr;
}

測試:

public static void main(String[] args) {
    int[] arr = {3, 9, -1, 10, -2, 5, 21};
    SortTest sortTest = new SortTest();
    sortTest.OneStepBubbleSort(arr);
}

結(jié)果:

在這里插入圖片描述

那么第二趟排序后第二大的元素10會被排到倒數(shù)第二的位置。

第二趟排序

public int[] TwoStepBubbleSort(int arr[]){
    int temp = 0;
    for (int i = 0; i < arr.length - 1 - 1; i++){
        if (arr[i] > arr[i + 1]){
            temp = arr[i];
            arr[i] =  arr[i + 1];
            arr[i + 1] = temp;
        }
    }
    System.out.print("第2趟排序完成:");
    System.out.println(Arrays.toString(arr));
    return arr;
}

測試:

public static void main(String[] args) {
    int[] arr = {3, 9, -1, 10, -2, 5, 21};
    SortTest sortTest = new SortTest();
    sortTest.OneStepBubbleSort(arr);
    sortTest.TwoStepBubbleSort(arr);
}

結(jié)果:

在這里插入圖片描述

第三趟排序

public int[] ThreeStepBubbleSort(int arr[]){
    int temp = 0;
    for (int i = 0; i < arr.length - 1 - 2; i++){
        if (arr[i] > arr[i + 1]){
            temp = arr[i];
            arr[i] =  arr[i + 1];
            arr[i + 1] = temp;
        }
    }
    System.out.print("第3趟排序完成:");
    System.out.println(Arrays.toString(arr));
    return arr;
}

測試:

public static void main(String[] args) {
    int[] arr = {3, 9, -1, 10, -2, 5, 21};
    SortTest sortTest = new SortTest();
    sortTest.OneStepBubbleSort(arr);
    sortTest.TwoStepBubbleSort(arr);
		sortTest.ThreeStepBubbleSort(arr);
}

結(jié)果:

在這里插入圖片描述

如此類推,每一趟排序中不同的地方在于循環(huán)的終止條件:arr.length - 1 和 arr.length - 1 - 1 和 arr.length - 1 - 2 等等,那么只需要在此循環(huán)外面再包一層循環(huán)即可。最終代碼為:

冒泡排序算法代碼

public int[] BubbleSort(int arr[]){
    int temp = 0;
    for (int i = 0; i < arr.length - 1; i++) {
        for (int j = 0; j < arr.length - i - 1 ; j++) {
            if (arr[j] > arr[j + 1]){
                temp = arr[j];
                arr[j] =  arr[j + 1];
                arr[j + 1] = temp;
            }
        }
        System.out.print("第" + (i + 1) + "趟排序完成:");
        System.out.println(Arrays.toString(arr));
    }
    return arr;
}

測試:

public static void main(String[] args) {
        int[] arr = {3, 9, -1, 10, -2, 5, 21};
        SortTest sortTest = new SortTest();
        System.out.println();
        sortTest.BubbleSort(arr);
    }

結(jié)果:

在這里插入圖片描述

改進冒泡排序

從上面冒泡排序的結(jié)果可以看出,總共進行了6趟排序,但從第4躺開始數(shù)組就已經(jīng)排序完畢了,后面的兩趟排序相當于在做無用的比較。

為了解決此問題,我們可以進行優(yōu)化,思想是:如果發(fā)現(xiàn)在某一趟排序中沒有發(fā)生過一次交換,那么可以提前結(jié)束冒泡排序。實現(xiàn)方法是設(shè)置一個flag變量來記錄是否發(fā)生過交換:

public int[] BubbleSort(int arr[]){
    int temp = 0;
    boolean flag = false;
    for (int i = 0; i < arr.length - 1; i++) {
        for (int j = 0; j < arr.length - i - 1 ; j++) {
            if (arr[j] > arr[j + 1]){
                flag = true;
                temp = arr[j];
                arr[j] =  arr[j + 1];
                arr[j + 1] = temp;
            }
        }
        // 判斷flag
        if (!flag){
        // 如果flag是false,則退出
            break;
        }else {
        // flag為true,說明發(fā)生過交換,那么在進行下一趟前需要把flag重新置為false
            flag = false;
        }
        System.out.print("第" + (i + 1) + "趟排序完成:");
        System.out.println(Arrays.toString(arr));
    }
    return arr;
}

測試:

public static void main(String[] args) {
        int[] arr = {3, 9, -1, 10, -2, 5, 21};
        SortTest sortTest = new SortTest();
        System.out.println();
        sortTest.BubbleSort(arr);
    }

結(jié)果:

在這里插入圖片描述

到此這篇關(guān)于Java排序算法之冒泡排序的原理及優(yōu)化的文章就介紹到這了,更多相關(guān)Java冒泡排序的原理及優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot健康檢查監(jiān)控全過程

    springboot健康檢查監(jiān)控全過程

    文章介紹了Spring Boot如何使用Actuator和Micrometer進行健康檢查和監(jiān)控,通過配置和自定義健康指示器,開發(fā)者可以實時監(jiān)控應(yīng)用組件的狀態(tài),Micrometer支持多種監(jiān)控系統(tǒng),如Prometheus,而Grafana則用于可視化監(jiān)控數(shù)據(jù),文章還提供了配置示例和常見問題解決方案
    2025-01-01
  • Java中forward轉(zhuǎn)發(fā)與redirect重定向的區(qū)別

    Java中forward轉(zhuǎn)發(fā)與redirect重定向的區(qū)別

    轉(zhuǎn)發(fā)和重定向都是常用的頁面跳轉(zhuǎn)方式,但在實現(xiàn)上有一些區(qū)別,本文主要介紹了Java中forward轉(zhuǎn)發(fā)與redirect重定向的區(qū)別,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • Java關(guān)于jar包的知識詳解

    Java關(guān)于jar包的知識詳解

    這篇文章主要介紹了Java關(guān)于jar包的知識,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • Java如何確定兩個區(qū)間范圍是否有交集

    Java如何確定兩個區(qū)間范圍是否有交集

    這篇文章主要介紹了Java如何確定兩個區(qū)間范圍是否有交集問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • JPA之映射mysql text類型的問題

    JPA之映射mysql text類型的問題

    這篇文章主要介紹了JPA之映射mysql text類型的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java實現(xiàn)占位符名稱替換值

    Java實現(xiàn)占位符名稱替換值

    占位符現(xiàn)在應(yīng)該說是比較流行的動態(tài)賦值,本文主要介紹了Java占位符名稱替換值,根據(jù)一串帶著參數(shù)名占位符的url,替換掉對應(yīng)參數(shù)名的值,感興趣的可以了解一下
    2021-07-07
  • 原來Java接口多實現(xiàn)還可以這樣玩

    原來Java接口多實現(xiàn)還可以這樣玩

    JAVA中類不直接支持多繼承,因為會出現(xiàn)調(diào)用的不確定性,所以JAVA將多繼承機制進行改良,在JAVA中變成了多實現(xiàn),這篇文章主要給大家介紹了關(guān)于Java接口多實現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • SSM項目實現(xiàn)短信驗證碼登錄功能的示例代碼

    SSM項目實現(xiàn)短信驗證碼登錄功能的示例代碼

    這篇文章主要為大家分享了在SSM項目中實現(xiàn)短信驗證碼登錄功能的示例代碼,文中的實現(xiàn)步驟講解詳細,感興趣的小伙伴可以跟隨小編一起動手嘗試一下
    2022-05-05
  • SpringBoot接口請求入?yún)⒑统鰠⒃鰪姷奈宸N方法

    SpringBoot接口請求入?yún)⒑统鰠⒃鰪姷奈宸N方法

    這篇文章主要介紹了SpringBoot接口請求入?yún)⒑统鰠⒃鰪姷奈宸N方法,使用`@JsonSerialize`和`@JsonDeserialize`注解,全局配置Jackson的`ObjectMapper`,使用`@ControllerAdvice`配合`@InitBinder`,自定義HttpMessageConverter和使用AOP進行切面編程,需要的朋友可以參考下
    2024-07-07
  • 淺談Java變量的初始化順序詳解

    淺談Java變量的初始化順序詳解

    本篇文章是對Java變量的初始化順序進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06

最新評論