Java冒泡排序及其時間複雜度計算

  • @author Dylaniou
  • 2020-05-28 21:21

冒泡排序算法:

  • 第一輪冒泡排序
    • 第一次拿數組的第1位和第2位進行比較,若第1位大於第2位,則將兩者的值交換,
    • 再繼續拿交換後的第1位與第3位進行比較,若第1位大於第3位,則將兩者的值交換,
    • 然後再繼續拿交換後的第1位與後續位進行比較,直到第1位與後續所有位置都比較完畢,最後會發現第一輪冒泡排序的最終結果是把最小值放到了第1位;
  • 第二輪冒泡排序:因爲第一輪已經把最小值放到了第1位,則第二輪應該從第2位開始
    • 第一次拿數組的第2位和第3位進行比較,若第2位大於第3位,則將兩者的值交換,
    • 再繼續拿交換後的第2位與第4位進行比較,若第2位大於第4位,則將兩者的值交換,
    • 然後再繼續拿交換後的第2位與後續位進行比較,直到第2位與後續所有位置都比較完畢,最後會發現第二輪冒泡排序的最終結果是把次小值放到了第2位;
  • 後續輪次的排序思想跟前兩輪類似,每次冒泡排序,都會把剩餘位置裏最小的那個值放到該次冒泡排序的起始位置,這樣經過(數組長度-1)輪的冒泡後,就可以得到一個排好序的數組啦。
    冒泡排序時間複雜度
    • 假設數組的長度爲n,從上述算法表述中可得,會經歷(n-1)輪冒泡,而每一輪的冒泡裏面其實又經歷了(n-m)次的比值交換處理,m代表的是第幾輪:
    • 正數第1輪,經歷(n-1)次比值交換
    • 正數第2輪,經歷(n-2)次比值交換
    • 倒數第2輪,經歷2次比值交換
    • 倒數第1輪,經歷1次比值交換
    • 故,可得,總耗費步驟爲:(n-1)+(n-2)+…2+1=[(1+(n-1))(n-1)]/2=(n(n-1))/2=(n²-n)/2=n²/2-n/2,根據時間複雜度計算原則,去掉常量,低階項,再去掉高階項的常量係數,得到時間複雜度爲T(n)= =O(n²)。
    • 最優情況(O(n)):由於算法結構的限定,(n-1)輪的外層冒泡排序肯定是要進行的,而每一輪的冒泡排序裏的比值交換則次數,在最優情況下,即數組已經排好序的情況下,裏層的比值交換次數爲0,即不需要交換。
    • 最壞情況(O(n²)):與要排序的順序完全相反,即上述時間複雜度推導過程。

*/

import java.util.Arrays;
public class BubbleSort {
	public static void main(String[] args) {
		int count = 0;
		int[] arr = {5,4,3,2,1};
		System.out.println("原始數組:" + Arrays.toString(arr));
		for(int i=0; i<arr.length-1; i++){
			System.out.println(i+1);
			for(int j=i+1;j<arr.length;j++){
				if(arr[i]>arr[j]){
					int temp = arr[j];
					arr[j]=arr[i];
					arr[i]=temp;
					System.out.println(Arrays.toString(arr) + (++count));
				}
			}
		}
	}	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章