【資料結構與演算法】------氣泡排序
阿新 • • 發佈:2018-11-19
學習開發一年的時間裡,很少去了解排序演算法,氣泡排序也是最開始學習的樣子,靠死記硬背,沒有引入自己的理解。
對於什麼時間複雜度和空間複雜度和穩定性也不清楚其原委,或許在程式碼方面少了幾許的天分:
氣泡排序:
氣泡排序每一輪的比較都是前面的數和後面的數進行比較,並交換位置,每一輪結束,最大值就位於序列末尾。
下面程式碼是最初的氣泡排序程式碼:
public class bubbleSort { public static void sort(int[] arr) { for(int i=0;i<arr.length-1;i++) { for(int j=0;j<arr.length-1-i;j++) { if(arr[j]>arr[j+1]) { int num = arr[j]; arr[j]=arr[j+1]; arr[j+1]=num; } } } } public static void main(String[] args) { int[] arr = {20,40,30,10,60,50}; sort(arr); for(int i=0;i<arr.length;i++) { System.out.println(arr[i]); } } }
因為氣泡排序,是前後兩個數進行比較,即使一個序列後半部分是一個有序的序列,氣泡排序還是挨個進行比較這樣就比較浪費時間。 通過新增一個識別符號,如果有一輪比較,識別符號沒有改變,就結束迴圈。
程式碼如下:
public class bubbleSort { public static void main(String[] args) { int[] arr = {49,38,65,97,76,27,49}; bubbleSort(arr); for(int i = 0;i < arr.length;i++){ System.out.println(arr[i]); } } public static void bubbleSort(int[] arr){ boolean flag;// for(int i = arr.length-1; i > 0; i--){ flag = false; for(int j = 0; j < i; j++){ if(arr[j] > arr[j+1]){ swap(arr,j,j+1); flag = true; } } if(!flag){ return; } } } public static void swap(int[] arr,int m,int n){ int num = arr[m]; arr[m] = arr[n]; arr[n] = num; } }
氣泡排序是穩定的,因為當a = b時,只有大於才進行位置的交換,故 a 和 b 的位置沒有計劃進行交換,所以演算法穩定。