核心思想:冒泡排序是一種典型的 交換排序 ,經過比較相鄰元素大小來決定是否交換位置html
冒泡排序的思想:不停地比較相鄰的兩個記錄,若是相鄰的兩個記錄的次序是反序則交換,直到全部的記錄都已經排好序了(使關鍵字最小或最大的記錄如氣泡通常逐漸往上「漂浮」直至「水面」,因此叫冒泡排序)。git
比較相鄰的元素。若是第一個比第二個大,就交換他們兩個。github
對每一對相鄰元素做一樣的工做,從開始第一對到結尾的最後一對。這步作完後,最後的元素會是最大的數。算法
針對全部的元素重複以上的步驟,除了最後一個。數據結構
(1)順序排列時,冒泡排序總的比較次數爲n-1(比較一輪後就跳出循環),移動次數爲0;
(2)逆序排序時,冒泡排序總的比較次數爲n(n-1)/2,移動次數爲n(n-1)/2次;
(3)當原始序列雜亂無序時,平均時間複雜度爲O(n^2)。函數
冒泡排序排序過程當中,Swap函數須要一個臨時變量temp進行兩兩交換,所須要的額外空間爲1,所以空間複雜度爲O(1)。性能
冒泡排序在排序過程當中,元素兩兩交換時,相同元素的先後順序並無改變,因此冒泡排序是一種穩定排序算法。學習
能歸位,每一趟排序有一個元素歸位。動畫
public int[] bubbleSort1(int[] sourceArray) throws Exception { // 對 arr 進行拷貝,不改變參數內容
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); for (int i = 1; i < arr.length; i++) { for (int j = 0; j < arr.length - i; j++) { if (arr[j] > arr[j + 1]) {//等於就不交換,保證了穩定性 int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } } return arr; } /* *設置一個標識,若是在某一趟遍歷中沒有發生交換,說明排序已經完成,即算法完成 */
public int[] bubbleSort2(int[] sourceArray) throws Exception { // 對 arr 進行拷貝,不改變參數內容
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); for (int i = 1; i < arr.length; i++) { // 設定一個標記,若爲true,則表示這次循環沒有進行交換,也就是待排序列已經有序,排序已經完成。
boolean flagChange = true; for (int j = 0; j < arr.length - i; j++) { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; flagChange = false; } } if (flagChange) { break; } } return arr; } // set flag to indicate what next step should begin from
public int[] bubbleSort3(int[] sourceArray) { // 對 arr 進行拷貝,不改變參數內容
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); int tmpNextPosition = sourceArray.length-1; for (int i = 1; i < arr.length; i++) { // 設定一個標記,若爲true,則表示這次循環沒有進行交換,也就是待排序列已經有序,排序已經完成。
boolean flagChange = true; int nextPosition = tmpNextPosition; for (int j = 0; j < nextPosition; j++) { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; flagChange = false; tmpNextPosition = j; } } if (flagChange) { break; } } return arr; }