【排序算法】冒泡排序的實現與分析

以升序排序爲例:

  • 實現方法

將所有的待排序的n個數字放入數組中。從第1個數字開始遍歷數組,兩兩比較數組中的元素,如果前者大於後者,則將兩者位置進行交換。一次遍歷後,最大值將排在最後一個位置上。然後對前n-1個元素做第二次遍歷和交換,遍歷後第二大的數字將被排到數組的倒數第二個位置。以此類推。

  • 代碼實現

public class BubbleSort {
	public static void main(String args[]) {  
		int[] numbers={-1, 0, 50, 44, -90};
		sort(numbers);
		for(int number : numbers) { 
			System.out.println(number); 
		} 
	}
	static void sort(int[] numbers){
		int temp;
		//n-1次遍歷
		for(int i=0;i<numbers.length-1;i++){
			for(int j=0; j<numbers.length-1-i;j++){
				if(numbers[j]>numbers[j+1]){
					temp=numbers[j];
					numbers[j]=numbers[j+1];
					numbers[j+1]=temp;
				}
			}
		}	
	}
}

  • 複雜度分析
    • 時間複雜度

時間複雜度主要從判斷的次數來進行分析。

由代碼可知,判斷的次數爲(n-1)+(n-2)+...+2+1 = n(n-1)/2 = (n^2)/2-n/2

證明時間複雜度爲O(n^2):

首先需要確定常數c1, c2, n0, 使得對於所有的n>=n0,都有c1*(n^2) <= (n^2)/2-n/2 <= c2*(n^2)

將用n^2除不等式得c1< = 1/2-1/2n <= c2

對於左邊的不等式c1< = 1/2-1/2n,c1<=1/4時對所有的n>=2都成立。

對於右邊的不等式1/2-1/2n <= c2,c2>=1/2時對所有的n>=2都成立。

我們取c1=1/4,c2=1/2,n0=2,此時對於所有的n>=n0,都有c1*(n^2) <= (n^2)/2-n/2 <= c2*(n^2)

因此冒泡排序的時間複雜度爲O(n^2)

值得注意的是,儘管判斷次數爲O(n^2),但交換的次數會由於原始數據的順序不同而有很大的區別。當原始數據的排列順序剛好是有序的,交換次數爲0,若原始數據的排列順序是倒序的,交換次數和判斷次數相同,爲O(n^2)。

    • 空間複雜度

由於只用了一個臨時變量,空間複雜度爲O(1)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章