排序算法之冒泡排序

從今天開始,希望能將幾種排序算法一一展現,也算是對自己學習的一個總結,先從冒泡排序開始。

冒泡排序可能是我們最先接觸的排序算法,至少大學裏我學的第一種算法就是它,話不多說,讓我們看看冒泡排序。

冒泡排序:在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。

這就是冒泡排序的基本思想,總之,每次排序之後就將最大(或最小)的數放在最後,而且對於n個數來說,每一次,我們需要n-1次排序

實現代碼:

public static void bubbleSort(int[] array){
		//對於n個數,只需n-1次排序
		int length = array.length-1;
		for(int i = 0; i < length; i++){
			for(int j = 0; j < length-i; j++){
				//升序排序,大於後一個則交換
				if(array[j] > array[j+1]){
					int temp = array[j];
					array[j] = array[j+1];
					array[j+1] = temp;
				}
			}
		}
	}

從實現代碼上來看,我們可以得知,冒泡排序屬於交換排序。在內存中,除了n個數組本身佔用的空間外,不再佔用其他空間(變量除外),所以冒泡排序的空間複雜度爲O(n)。在最好的情況下,即內部循環體(即if語句塊中的代碼)一次也不執行,此時只執行外部循環體代碼n-1次,所以冒泡排序在最好的情況下,其時間複雜度爲O(n)。在最壞的情況下,即內部循環體每次都會執行(例如將倒序的數組轉爲正序),外部第一次循環,內部將執行n-1次;外部第二次循環,內部執行n-2次;…..外部第n-1次循環,內部執行1次。

所以結果是n-1 + n-2 + … + 1。等差數列,結果爲(n-1)n=n^2-n。所以最壞的情況下冒泡排序的時間複雜度爲O(n^2)。平均複雜度爲O(n^2)。

測試代碼:

public static void main(String[] args) {
		int[] array = new int[100]; 
		Random random = new Random();
		for(int i = 0; i < array.length; i++){
			array[i] = random.nextInt(200);
		}
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i] + " ");
		}
		System.out.println("\n排序後");
		bubbleSort(array);
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i] + " ");
		}
	}

点赞