冒泡排序的時間用大O表示法是O(N^2).算法
傳統的冒泡排序:數組
/** * @param total 要排序的數組長度 */ public void sort(int total){ int num[]; if(total <= 0){ System.out.println("請輸入大於0的正整數"); }else{ num = new int[total]; for (int i = 0 ; i < total; i++){ //生成隨機1到100之間的數 Random ra =new Random(); num[i] = ra.nextInt(100)+1; } System.out.println("要排序的數組爲:" + Arrays.toString(num)); int sum = 0; int out,in; for (out = total - 1; out > 1; out--){ for (in = 0 ; in < out; in++){ sum ++; if(num[in] > num[in+1]){ int temp = num[in]; num[in] = num[in+1]; num[in+1] = temp; } } } // 最原始的冒泡排序 for(int i = 0; i < total -1 ; i ++){ for (int j = 0 ; j < total -1 ; j++){ sum ++; if(num[j] > num[j+1]){ int temp = num[j]; num[j] = num[j+1]; num[j+1] = temp; } } } System.out.println("排序完成的數組爲:" + Arrays.toString(num)); System.out.println("總共用次數:" + sum); } }
優化事後的冒泡排序:dom
/** * @param total 要排序的數組長度 */ public void sort(int total){ int num[]; if(total <= 0){ System.out.println("請輸入大於0的正整數"); }else{ num = new int[total]; for (int i = 0 ; i < total; i++){ //生成隨機1到100之間的數 Random ra =new Random(); num[i] = ra.nextInt(100)+1; } System.out.println("要排序的數組爲:" + Arrays.toString(num)); /**核心算法: * 雙重循環,外層循環用於控制排多少次序。 * 內層循環從第一位開始一直日後比較,內層循環一次後,能夠將最大的數至於末尾。 * 外層循環讓內層循環繼續排沒有排序過的數組,排序過的不用再排。 */ int sum = 0; int out,in; for (out = total - 1; out > 1; out--){ for (in = 0 ; in < out; in++){ sum ++; if(num[in] > num[in+1]){ int temp = num[in]; num[in] = num[in+1]; num[in+1] = temp; } } } System.out.println("排序完成的數組爲:" + Arrays.toString(num)); System.out.println("總共用次數:" + sum); } }
你們對比能夠發現,就是外層循環的時候有點變化,其餘的代碼都是如出一轍的。優化
那麼優化後的算法能快多少呢。咱們都以數組長度爲10來計算:code
傳統冒泡排序:9x9=81步,排序
優化後的冒泡排序:9+8+7+6+5+4+3+2=44步。循環
由於優化後的冒泡排序,每排完一次,最後一個數已是最大的,就不須要再比較了。next