從今天開始,希望能將幾種排序算法一一展現,也算是對自己學習的一個總結,先從冒泡排序開始。
冒泡排序可能是我們最先接觸的排序算法,至少大學裏我學的第一種算法就是它,話不多說,讓我們看看冒泡排序。
冒泡排序:在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。
這就是冒泡排序的基本思想,總之,每次排序之後就將最大(或最小)的數放在最後,而且對於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] + " ");
}
}