①、比較相鄰的元素。若是第一個比第二個大,就交換他們兩個。算法
②、對每一對相鄰元素做一樣的工做,從開始第一對到結尾的最後一對。這步作完後,最後的元素會是最大的數(也就是第一波冒泡完成)。數組
③、針對全部的元素重複以上的步驟,除了最後一個。性能
④、持續每次對愈來愈少的元素重複上面的步驟,直到沒有任何一對數字須要比較。測試
public static int[] sort(int[] array){ //這裏for循環表示總共須要比較多少輪 for(int i=1;i<array.length;i++){ // j的範圍很關鍵,這個範圍是在逐步縮小的,由於每輪比較都會將最大的放在右邊 for(int j=0;j<array.length-i;j++){ if(array[j]>array[j+1]){ int temp = array[j+1]; array[j+1] = array[j]; array[j] = temp; } } } return array; }
public static void main(String[] args) { int [] array = {9,222,100,4,8,6,35,2,4,1,0}; Maopao.sort(array); for(int i=0;i<array.length;i++){ System.out.println(array[i]); } }
冒泡排序是由兩個for循環構成,第一個for循環的變量 i 表示總共須要多少輪比較,第二個for循環的變量 j 表示每輪參與比較的元素下標【0,1,......,length-i】,由於每輪比較都會出現一個最大值放在最右邊,因此每輪比較後的元素個數都會少一個,這也是爲何 j 的範圍是逐漸減少的。相信你們理解以後快速寫出一個冒泡排序並不難。spa
假設參與比較的數組元素個數爲 N,則第一輪排序有 N-1 次比較,第二輪有 N-2 次,如此類推,這種序列的求和公式爲:code
(N-1)+(N-2)+...+1 = N*(N-1)/2blog
當 N 的值很大時,算法比較次數約爲 N2/2次比較,忽略減1。排序
假設數據是隨機的,那麼每次比較可能要交換位置,可能不會交換,假設機率爲50%,那麼交換次數爲 N2/4。不過若是是最壞的狀況,初始數據是逆序的,那麼每次比較都要交換位置。for循環
交換和比較次數都和N2 成正比。因爲常數不算大 O 表示法中,忽略 2 和 4,那麼冒泡排序運行都須要 O(N2) 時間級別。性能分析
其實不管什麼時候,只要看見一個循環嵌套在另外一個循環中,咱們均可以懷疑這個算法的運行時間爲 O(N2)級,外層循環執行 N 次,內層循環對每一次外層循環都執行N次(或者幾分之N次)。這就意味着大約須要執行N2次某個基本操做。