a[j+1],則交換兩個元素,兩兩都比較一遍稱為一輪冒泡,結果是讓最大的元素排至最后。實現冒泡程序的代碼如下:" /> 日韩欧美国产偷亚洲清高,国产精品亚洲专区在线观看,国产福利电影一区二区三区

2020久久超碰欧美精品最新亚洲欧美日韩久久精品,国产福利电影一区二区三区,亚洲欧美日韩一区在线观看,亚洲国产欧美日韩欧美特级,亚洲欧美日韩成人一区久久,欧美日韩精品一区二区三区不卡,国产欧美日韩va另类影音先锋,亚洲欧美日韩久久精品,亚洲欧美日韩国产成人精品影院,亚洲国产欧美日韩精品一区二区三区,欧美日韩国产成人高清视频,日韩久久精品国产免费观看频道,久久人人爽人人爽从片av高清,国产精品综合一区二区

首頁技術文章正文

說說什么是冒泡排序?手撕代碼【java面試題】

更新時間:2022-01-11 來源:黑馬程序員 瀏覽量:

(1)要求

能夠用自己語言描述冒泡排序算法

能夠手寫冒泡排序代碼

了解一些冒泡排序的優化手段

(2)算法描述

  • 依次比較數組中相鄰兩個元素大小,若 a[j] > a[j+1],則交換兩個元素,兩兩都比較一遍稱為一輪冒泡,結果是讓最大的元素排至最后
  •  重復以上步驟,直到整個數組有序

(3)算法實現
實現冒泡程序的代碼如下:

public static void bubble(int[] a) {
    for (int j = 0; j < a.length - 1; j++) {
        // 一輪冒泡
        boolean swapped = false; // 是否發生了交換
        for (int i = 0; i < a.length - 1 - j; i++) {
            System.out.println("比較次數" + i);
            if (a[i] > a[i + 1]) {
                Utils.swap(a, i, i + 1);
                swapped = true;
            }
        }
        System.out.println("第" + j + "輪冒泡"
                           + Arrays.toString(a));
        if (!swapped) {
            break;
        }
    }
}

優化點1:每經過一輪冒泡,內層循環就可以減少一次

優化點2:如果某一輪冒泡沒有發生交換,則表示所有數據有序,可以結束外層循環

(4)進一步優化

public static void bubble_v2(int[] a) {
    int n = a.length - 1;
    while (true) {
        int last = 0; // 表示最后一次交換索引位置
        for (int i = 0; i < n; i++) {
            System.out.println("比較次數" + i);
            if (a[i] > a[i + 1]) {
                Utils.swap(a, i, i + 1);
                last = i;
            }
        }
        n = last;
        System.out.println("第輪冒泡"
                           + Arrays.toString(a));
        if (n == 0) {
            break;
        }
    }
}

每輪冒泡時,最后一次交換索引可以作為下一輪冒泡的比較次數,如果這個值為零,表示整個數組有序,直接退出外層循環即可。

分享到:
在線咨詢 我要報名
和我們在線交談!