冒泡排序(Bubble Sort) 是一種最簡單的排序演算法。基本思想:迭代地對輸入序列中的第一個元素到最後一個元素進行兩兩比較,當需要時交換兩個元素位置。
public static void bubbleSort(int[] array) { // 擷取數組元素個數 int n = array.length; // 這種for迴圈是為了避免比較已經排好序的資料 for (int pass = n - 1; pass >= 0; pass--) { // 只比較未排序部分 for (int i = 0; i < pass; i++) { // 最大值向後移動 if (array[i] > array[i + 1]) { int temp = array[i]; array[i] = array[i + 1]; array[i + 1] = temp; } } }}
可以通過委任標記來改進冒泡演算法。在排序過程中,沒有交換操作則意味著排序完成。如果序列已經是有序的,則可以通過判斷該標記來結束演算法。
public static void bubbleSortImproved(int[] array) { // 擷取數組元素個數 int n = array.length; // 標記每一趟排序是否出現資料交換 boolean swapped = true; // 這種for迴圈是為了避免比較已經排好序的資料 for (int pass = n - 1; pass >= 0 && swapped; pass--) { swapped = false; // 只比較未排序部分 for (int i = 0; i < pass; i++) { // 最大值向後移動 if (array[i] > array[i + 1]) { int temp = array[i]; array[i] = array[i + 1]; array[i + 1] = temp; // 出現資料交換 swapped = true; } } }}
選擇排序(Selection Sort)是一種原地排序(即不需要額外的儲存空間)演算法,適用於小檔案。思路:1.尋找序列中最小值2.用當前位置的交換最小值3.對所有元素重複上述過程,直到序列排序完成
public static void selectionSort(int[] array) { // 擷取數組元素個數 int n = array.length; // 最小值的下標 int min ; // 臨時變數 int temp; // 尋找最小值位置並與當前位置交換 for (int i = 0; i < n; i++) { min = i; // 尋找最小值位置 for (int j = i + 1; j < n; j++) { if (array[j] < array[min]) { min = j; } } // 交換元素 temp = array[i]; array[i] = array[min]; array[min] = temp; }}
插入排序(Selection Sort)是一種簡單且高效的比較排序演算法。典型的原地排序 思路:每次從輸入資料中移除一個元素並將其插入已排序序列的正確位置,直到所有輸入輸入元素都插入有序序列中。
public static void insertionSort(int[] array) { // 擷取數組元素個數 int n = array.length; // 臨時變數 int temp; // 有序序列的迴圈變數 int j; for (int i = 1; i < n; i++) { // 擷取輸入資料 temp = array[i]; j = i; // 排序 while (j >= 1 && (array[j - 1] > temp)) { array[j] = array[j - 1]; j--; } // 將資料放入有序序列 array[j] = temp; }}
測試代碼,敬請參考資料結構與演算法(JAVA版)