冒泡排序的原理是從第一個數字開始,依次讓相鄰的兩個數字進行比較,按照從大到小或從小到大的順序進行交換(若是是升序排列就把小的放前面,若是降序排列就把大的放前面)。算法
第一趟比較後,就把最大的的數字放在最後一個位置(假設按照升序排列),而後進行第二趟比較,依次進行相鄰數字比較,第二趟比較後次大的數字放在了倒數第二個位置。數組
進行n-1(n表明待排序的數字個數)趟比較後(最後只剩一個無需比較),數字即爲有序排列。dom
假設要排列的數字爲 3 1 4 2 ,當進行第一趟排序時,以下圖所示(其中i表示數組的下標)測試
第一趟排序執行完後,數組中最大的數字4已找到,並放在數組的最後一後位置,因此後續比較無需再跟最後一個比較。下面看第二趟排序過程,以下圖優化
第二趟排序執行完,數組的次大數字3已找到,並放在數組的倒數第二的位置。此時因爲咱們選取的排列數據巧合,第三大的數字2也放在了倒數第三的位置,但按照咱們比較邏輯,此時並不知道第三大數字已經找到,因此還會進行第三趟比較。以下圖所示spa
按照咱們的邏輯,當第三趟比較執行完後,第三大的數字2已找到並放在倒數第三位的位置。剩下最後一個數字1無需再比較它自己的位置就是它應該所在的位置。code
咱們能夠發現,當有4個數字時,只需進行3趟排序便可將無序數字變爲有序,而每趟比較都會比上一次少比較一次(因上一趟比較已經肯定了一個較大數字位置)blog
另外,在咱們例子中,第三趟比較前數字已經處於正確的序列,因此無需再進行後續比較(固然咱們恰好只比較三趟,若是有5個或更多數字,則能夠省去後續比較)排序
下面看一下具體代碼實現for循環
1 public static void bubbleSort(int array[]){ 2 int temp = 0; 3 for (int i = 0; i < array.length - 1; i++) { 4 //有n個數據,只須要n-1趟排序便可 5 boolean flag = true; 6 for(int j=0;j<array.length -1 -i ;j++){ 7 if(array[j] > array[j+1]){ 8 flag = false; 9 temp = array[j]; 10 array[j] = array[j+1]; 11 array[j+1] = temp; 12 } 13 } 14 if(flag){ 15 break; 16 } 17 } 18 }
1)第一層for循環用於肯定進行幾趟比較,前面咱們分析過,只需進行n-1趟比較便可
2)第二層for循環用於從第1個數字開始,依次跟相鄰數字進行比較。每進行一趟比較後,就可少比較一位數字
3)在進行第二層循環比較時,設定一個標誌位flag,用於標示是否進行了數字交換,若是一次都沒有交換,說明此時數字已經有序,無需進行後續趟的比較
冒泡排序嵌套兩層循環進行排序,因此其時間複雜度爲T(n)=O(n^2)。
下面咱們生成10萬個隨機數的數組,使用冒泡排序方法進行排序,看其執行時間。在個人後續文章中,會繼續分享其餘幾種排序算法,並會在其餘幾種排序算法中也使用10萬個隨機數計算排序時間。
1 public static void main(String []args){ 2 int array[] = new int[100000]; 3 bubbleSort(array); 4 for(int i=0; i<100000; i++){ 5 array[i] = (int)(Math.random()*1000000); 6 } 7 long begin = System.currentTimeMillis(); 8 bubbleSort(array); 9 System.out.println("總耗時="+(System.currentTimeMillis()-begin)); 10 }
執行結果(單位爲毫秒)
能夠看出在咱們機器上使用冒泡排序算法對10萬條數據進行排序,大概須要17秒時間。下一篇我將分享選擇排序算法,選擇排序算法的執行時間是否會減少呢?一塊兒期待吧!
冒泡排序須要記住三點,一是比較的趟數n-1(最後一個數字無需比較),二是每進行一趟比較後就會肯定一個較大的數字位置,後續趟的比較次數會少一次。還有一點是優化點,當在比較過程當中數字的正確順序已經產生後,無需再進行後續趟的比較。