1. 程式人生 > >氣泡排序+怎麼計算時間複雜度

氣泡排序+怎麼計算時間複雜度

氣泡排序的基本思想

 

時間複雜度為O(N^2)

每次比較兩個相鄰元素,如果他們的順序錯誤就把它們交換過來。

舉個栗子

例如我們需要將 12,35,99,18,76,  5個數進行從大到小排序,既然是從大到小排序,也就是越小越靠後。
首先比較第一個數和第二個數,第一個是12,第二個是35,發現12 小於35,由於是越小越靠後,因此要對這兩個數交換位置,那麼交換後的順序為 35,12,99,18,76。按照之前的方法,我們比較第二個和第三個數,第二個是12第三個是99,99大於12,所以要交換兩個數的位置,交換過的順序為 35,99,12,18,76。以此類推,可以通過下圖來看12的位置變化:
12,35,99,18,76   初始資料
35,12,99,18,76   第1次交換
35,99,12,18,76   第2次交換
35,99,18,12,76   第3次交換
35,99,18,76,12   第4次交換 (5-1,假設要排序的個數為m,那麼比較次數m-1,那麼最糟糕情況下互動次數就是m-1)
進行4次交換後,就成功把最小的數12給排到最後面了。

現在我們已經將最小的數給歸位了,現在對剩下的數再進行歸位,細節我就不講了,就將下重要的。

對剩下4個數進行排序:

99,18,76,35,12 (交換了3次,比較次數3)

對剩下3個數進行排序:

99,76,18,35,12  (比較了1次【99,76】,交換了1次【18,76】,比較次數2)

對剩下2個數進行排序:

99,76,18,35,12 (交換了0次,比較1次)

 

就如同一個氣泡,一步步向上翻滾,最後成功浮出水面,所以他叫氣泡排序。

 

程式碼

	public static void main(String[] args) {
		//生成資料來源
		//待排序個數
		int n=5;
		int src[]=new int[n];
		src[0]=12;
		src[1]=35;
		src[2]=99;
		src[3]=18;
		src[4]=76;
		//氣泡排序
		//遍歷第一個到最後一個
		for (int i=0; i<n;i++) {//執行n次
			//比較剩餘的資料
		 for (int j=0 ;j<n-i-1; j++) {//j<n-i-1 防止src[j+1]陣列越界,執行n-1次
			if(src[j]<src[j+1]){
				int temp=src[j+1];//最差情況執行n-1次
				src[j+1]=src[j];//最差情況執行n-1次
				src[j]=temp;//最差情況執行n-1次
			}
		}
		}
		//列印排序
		for (int i=0; i<n;i++) {
			System.out.println(src[i]);//最差情況執行n次
		}
	}
//	 結果
//	99
//	76
//	35
//	18
//	12

}

 

 

 

為什麼時間複雜度為O(N^2)

計算最糟糕情況

 

要排序的個數n

 

第一層for

執行了n次

第二層for

第一次比較了n-1次

第二次比較了n-2次

....

第n-1次比較了1次

執行的總次數

count=3(1+2+3+4+.....+n-1)(n為正整數)

列印for

執行了n次

所有總的次數:

sum=n+3(1+2+3+4+...+n-1)+n+(n-n)=3(1+2+3+4+...+n-1+n)-n

如果n為偶數

sum=3* n/2*(n+1) -n=3/2(n^2+n)-n=1/2(3n^2+n)

如果n為奇數

sum=3((n-1)/2 *n+(n+1)/2)-n=3/2(n^2+1)-n=1/2(3n^2-2n+3)

所以最差的情況的時間複雜度為O(N^2),最好的情況我就不推了,O(N)