中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java冒泡排序的案例

發布時間:2020-10-28 15:05:10 來源:億速云 閱讀:150 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關Java冒泡排序的案例的內容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。

1、 導言

因為這是排序算法系列的第一篇文章,所以多啰嗦幾句。

排序是很常見的算法之一,現在很多編程語言都集成了一些排序算法,比如Java 的Arrays.sort()方法,這種方式讓我們可以不在乎內部實現細節而直接調用,在實際的軟件開發當中也會經常使用到。但是站在開發者的角度而言,知其然必須知其所以然。多練練排序算法,不僅能夠讓我們知道一些排序方法的底層實現細節,更能夠鍛煉我們的思維,提升編程能力。現在很多技術面試也會涉及到基本的排序算法,所以多練習是有好處的。(推薦:Java視頻教程)

文中涉及到的代碼都是Java實現的,但是不會涉及到太多的Java語言特性,并且我會加上詳細的注釋,幫助你理解代碼并且轉換成你熟悉的編程語言。

常見的排序算法有以下10種:

  • 冒泡排序、選擇排序、插入排序,平均時間復雜度都是O(n2)
  • 希爾排序、歸并排序、快速排序、堆排序,平均時間復雜度都是O(nlogn)
  • 計數排序、基數排序、桶排序,平均時間復雜度都是O(n + k)

在開始具體的排序算法講解之前,先得明白兩個概念:

  1. 原地排序:指的是在排序的過程當中不會占用額外的存儲空間,空間復雜度為O(1)。
  2. 排序算法的穩定性:一個穩定的排序,指的是在排序之后,相同元素的前后順序不會被改變,反之就稱為不穩定。舉個例子:一個數組 [3,5,1,4,9,6,6,12] 有兩個6(為了區分,我把其中一個 6 加粗),如果排序之后是這樣的:[1,3,4,5,6,6,9,12](加粗的 6 仍然在前面),就說明這是一個穩定的排序算法。
2. 言歸正傳

冒泡排序的思路其實很簡單,一個數據跟它相鄰的數據進行大小的比較,如果滿足大小關系,就將這兩個數據交換位置。一直重復這個操作,就能將數據排序。

舉個例子,假如有數組 a[3,5,1,4,9,6],第一次冒泡的操作如下圖所示:

Java冒泡排序的案例

重復進行這個操作,6次冒泡之后,數據排序完成。

根據這個思路,應該能很容易能夠寫出下面的代碼實現冒泡排序:

public class BubbleSort {

    //data表示整型數組,n表示數組大小
    public static void bubbleSort(int[] data, int n){
        //數組大小小于等于1,無須排序
        if (n <= 1) return;

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n - i - 1; j++) {
                //如果data[j] > data[j + 1],交換兩個數據的位置
                if (data[j] > data[j + 1]){
                    int temp = data[j];
                    data[j] = data[j + 1];
                    data[j + 1] = temp;
                }
            }
        }
    }
}

但是這個排序算法還可以進行優化,當冒泡操作已經沒有數據交換的時候,說明排序已經完成,就不用在進行冒泡操作了。例如上面的例子,第一次冒泡之后,數據為 [3,1,4,5,6,9],再進行一次冒泡,數據變為 [1,3,4,5,6,9],此時已經完成了排序,就可以結束循環了。

所以針對這個數組的排序,上面的代碼需要6次冒泡才能完成,其中有4次都是不需要的。所以可以對代碼進行優化:

public class BubbleSort {

    //優化后的冒泡排序
    //data表示整型數組,n表示數組大小
    public static void bubbleSort(int[] data, int n){
        //數組大小小于等于1,無須排序,返回空
        if (n <= 1) return;
        for (int i = 0; i < n; i++) {
            boolean flag = false;//判斷是否有數據交換

            for (int j = 0; j < n - i - 1; j++) {
                //如果data[j] > data[j + 1],交換兩個數據的位置
                if (data[j] > data[j + 1]){
                    int temp = data[j];
                    data[j] = data[j + 1];
                    data[j + 1] = temp;

                    flag = true;//表示有數據交換
                }
            }
            //如果沒有數據交換,則直接退出循環
            if (!flag) break;
        }
    }
}

好了,冒泡排序的基本思路和代碼都已經實現,最后總結一下:

  1. 冒泡排序是基于數據比較的
  2. 最好情況時間復雜度是O(n),最壞情況時間復雜度是O(n2),平均時間復雜度是O(n2)
  3. 冒泡排序是原地排序算法,并且是穩定的。

感謝各位的閱讀!關于Java冒泡排序的案例就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

义乌市| 手机| 玛沁县| 泸西县| 泽普县| 米泉市| 拜城县| 简阳市| 万安县| 屯留县| 泽普县| 成武县| 日喀则市| 华阴市| 双城市| 青冈县| 巴彦淖尔市| 石嘴山市| 拉萨市| 双峰县| 清原| 同江市| 息烽县| 金门县| 大理市| 法库县| 竹山县| 和硕县| 屏边| 正宁县| 泽库县| 攀枝花市| 囊谦县| 宣恩县| 尉氏县| 新沂市| 巴彦淖尔市| 玉龙| 顺昌县| 航空| 湘潭县|