以升序排序爲例:
- 實現方法
將所有的待排序的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)。