標籤:pre tcl [] 排序演算法 實現 title 元素 test 說明
本文對傳統的冒泡排序進行了一些最佳化,減少了迴圈次數。時間複雜度若檔案的初始狀態是正序的,一趟掃描即可完成排序。所需的關鍵字比較次數 C 和記錄移動次數 M 均達到最小值: C(min)=n-1 , M(min)=0 。所以,冒泡排序最好的時間複雜度為 O(n);若初始檔案是反序的,需要進行 趟排序。每趟排序要進行 次關鍵字的比較(1≤i≤n-1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種情況下,比較和移動次數均達到最大值:冒泡排序的最壞時間複雜度為O(n^2) 。綜上,因此冒泡排序總的平均時間複雜度為O(n^2) 。演算法穩定性冒泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以,如果兩個元素相等,我想你是不會再無聊地把他們倆交換一下的;如果兩個相等的元素沒有相鄰,那麼即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前後順序並沒有改變,所以冒泡排序是一種穩定排序演算法。
1 /** 2 * 冒泡排序 JAVA 3 * 最佳化後的冒泡排序 4 * 增加一個isSort本輪是否進行了排序的判斷,如果沒有進行排序則說明排序已經結束直接退出 5 * @author Administrator 6 * @time 20160731 7 */ 8 public abstract class BubblingSort { 9 ////////////////開始冒泡排序10 public static int[] Sort(int[] array )11 {12 boolean isSort=false;//判斷是否進行過排序,預設為沒有進行排序,如果沒有進行排序則直接結束13 for (int i = 0; i < array.length-1; i++) {14 isSort=false;//每輪排序前先將排序標識置位false15 for (int j = 0; j < array.length-i-1; j++) {16 if(array[j]>array[j+1])17 {18 int temp =array[j+1];19 array[j+1]=array[j];20 array[j]=temp;21 isSort=true;//如果為true則本輪進行了交換,繼續下一輪22 }23 }24 if(!isSort)break;//如果本輪沒有進行過迴圈,結果為false直接跳出,不進行下一輪的檢索25 }26 return array; //return array27 }28 ///////////結束冒泡排序29 }
自己在裡面加了個判斷是否已經排序結束,如果排序已經完成,則立即結束排序,不進行繼續迴圈檢測!
我在另一個類裡面調用的方法:
1 public class arithmetic_TestClass { 2 public static void main(String[] args) { 3 //測試數組 int 型 4 int array[]={4,9,5,3,7,6,8,3,2,1}; 5 6 //冒泡排序 最佳化過的冒泡排序 7 array=BubblingSort.Sort(array); 8 9 for (int i : array) {10 System.out.print(i+" ");11 }12 13 }14 }
執行的結果如下:
1 2 3 3 4 5 6 7 8 9
成功實現!
冒泡排序最佳化JAVA