搜尋
首頁Javajava教程Java冒泡排序的詳細介紹(程式碼範例)

這篇文章帶給大家的內容是關於Java冒泡排序的詳細介紹(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

1、 導言

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

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

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

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

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

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

    ##原地排序:指的是排序的過程當中不會佔用額外的儲存空間,空間複雜度為O(1)。
  1. 排序演算法的穩定性:一個穩定的排序,指的是排序之後,相同元素的前後順序不會被改變,反之稱為不穩定。舉個例子:一個陣列[3,5,1,4,9,6,
  2. 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  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  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. 最好情況時間複雜度是O(n),最壞情況時間複雜度是O(n
  2. 2),平均時間複雜度是O(n2)
  3. 冒泡排序是原地排序演算法,並且是穩定的。



以上是Java冒泡排序的詳細介紹(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:segmentfault。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具