Java演算法之氣泡排序—BubbleSort
程式碼如下:
public static void main(String[] args) {
int[] arr = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
for (int i = 0; i < arr.length - 1; i++) {// 外層迴圈控制排序趟數
for (int j = 0; j < arr.length - 1 - i; j++) {// 內層迴圈控制每一趟排序多少次
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
氣泡排序的效率
通過觀察arr陣列可以看到,第一次排序時進行了9次比較,第二次排序時進行了8次比較,如此類推,直到最後一次進行比較。
對於10個數據項,就是9+8+7+6+5+4+3+2+1=45
一般來說,陣列中有N個數據項,則第一次排序中有N-1次比較,第二次排序中有N-2次比較,以此類推。這樣徐磊的求和公式如下
(N-1)+(N-2)+(N-3)+ ... + 1 = N*(N-1)/2
當N為10時,N*(N-1)/2等於45(10*9)/2
這樣演算法作了約N*N次比較(忽略減1,不會有很大差異,特別是當N很大時)
因為兩個值只有在需要是才會交換,所有見換的次數少於比較的次數。如果資料是隨機的,那麼大概有一半的資料需要交換,則交換次數為N*N/4(不過在最壞的情況下,即初始資料逆序時,每次比較都需要交換,也就是上面的案例程式碼)。
交換和比較操作冊數都和N²成正比。由於常熟不算在大O表示法中,可忽略2和4,並且認為氣泡排序裕興需要O(N²)時間級別。執行資料越多,就越能看出氣泡排序的速度是很慢的。
只要看到一個迴圈巢狀在另一個迴圈裡,如氣泡排序等,就可以懷疑這個演算法的執行時間為O(N²)級。外層迴圈執行N次,內部迴圈對於每一次外層迴圈都執行N次。這就意味著將大約需要執行N*N或者N²次某個基礎操