1. 程式人生 > >算法大神之路----排序(冒泡排序法)

算法大神之路----排序(冒泡排序法)

border port 情況 ott 最大 交換 length n-1 next

冒泡排序法

冒泡排序法又稱為交換排序法,是由觀察水中冒泡變化構思而成,氣泡隨著水深壓力而改變.氣泡在水底時,水壓最大,氣泡最小,而氣泡慢慢浮上水面時,氣泡所受壓力最小,體積慢慢變大.

冒泡排序比較方式是從第一個元素開始,比較相鄰的元素大小,如果大小順序有誤,則對調後進行下一個元素比較.直到所有元素滿足關系為止.

冒泡排序法分析

  1. 冒泡排序法平均情況下,需要比較(n-1)/2次,時間復雜度為O(n2),最好的情況只需要掃描一次,不用操作,即作n-1次比較,時間復雜度為O(n).
  2. 由於冒泡排序為相鄰兩者相互比較對調,並不會改變其原本排列的順序,所以是穩定的排序法
  3. 只需要一個額外的空間,所以空間復雜度最佳
  4. 這個排序法適用於數據量小,或者有部分數據已經排序過的情況

代碼示例:

import java.util.Random;

/**
 * 算法大神之路----排序(冒泡排序法)
 */
public class Study01 {

    public static void main(String[] args) {

        //新建一個數組
        int[] arr = new int[6];
        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
        //使用隨機數給數組賦值
arr[i] = r.nextInt(50); } System.out.print("原數組為:"); paint(arr); System.out.println("-----排序-----"); //使用冒泡排序法進行排序,最差情況下 for (int i = arr.length-1; i >=0; i--) { //比較當前數和後一個數,誰大,誰放後面 for (int j = 0; j < i; j++) {
if(arr[j]>arr[j+1]){ int temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } System.out.print("掃描第"+(arr.length-i)+"次結果為:"); paint(arr); } } public static void paint(int[] arr){ for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]+"\t"); } System.out.println(); } }

結果:

原數組為:34    41    24    36    15    21    
-----排序-----
掃描第1次結果為:34    24    36    15    21    41    
掃描第2次結果為:24    34    15    21    36    41    
掃描第3次結果為:24    15    21    34    36    41    
掃描第4次結果為:15    21    24    34    36    41    
掃描第5次結果為:15    21    24    34    36    41    
掃描第6次結果為:15    21    24    34    36    41

可見:

  • 第一次掃描時候,把第二個數41一直比較到後面去了
  • 第二次掃描則是比較了,把36放到倒數第二個數
  • ...
  • 最後當第四次掃描的時候,已經排好序.最差情況下需要掃描"數組元素"次,一般,想要優化的話,即在程序中設置,當掃描到已經符合要求後,就直接停止掃描即可

算法大神之路----排序(冒泡排序法)