Java常用的八種排序演算法與程式碼實現(一):氣泡排序法、插入排序法、選擇排序法
這三種排序演算法適合小規模資料排序
---
共同點:基於比較,時間複雜度均為O(n2),空間複雜度均為O(1)(原地排序演算法)
不同點:插入排序和氣泡排序是穩定的排序演算法,選擇排序不是
---
穩定排序演算法:可以保持數值相等的兩個物件,在排序之後的順序不變
---
氣泡排序:只操作相鄰的兩個數,每次進行的操作只對相鄰的兩個數進行比較,看是否滿足條件,一次冒泡至少會移動一個數到它應該存在的位置,重複n次,就完成了資料的排序。每次操作都會將較小值往前推,較大值往後推,所以可能迴圈未結束時,排序工作已經被完成
圖解:
程式碼:
/** * 氣泡排序 * * @param arr 待排陣列 */ public static void bubbleSort(int[] arr) { int c; for (int i = 0; i < arr.length; i++) { for (int j = arr.length - 1; j > i; j--) { if (arr[j] < arr[j - 1]) { c = arr[j]; arr[j] = arr[j - 1]; arr[j - 1] = c; } } } }
---
插入排序:兩種操作,一種時元素的比較,一種是元素的移動,當我們需要將一個元素a插入已排區間時,需要拿a與已排區間的元素依次比較大小,找到合適的位置插入,還需要將插入點的元素位置進行移位,這樣才能騰出後面的位置給元素a
圖解:
程式碼:
/** * 插入排序 * * @param arr 待排陣列 */ public static void insertSort(int[] arr) { int c; for (int i = 1; i < arr.length; i++) { for (int j = 0; j < i; j++) { if (arr[j] > arr[i]) { c = arr[j]; arr[j] = arr[i]; arr[i] = c; } } } }
---
選擇排序:基本同插入排序,區分已排區間和未排區間,每次遍歷會找到未排區間內的最小元素,將其放到已排區間的末尾
圖解:
程式碼:
/** * 選擇排序 * * @param arr 代排陣列 */ public static void selectionSort(int[] arr) { for (int i = 0; i < arr.length; i++) { int min = i; for (int j = i; j < arr.length; j++) { if (arr[j] < arr[min]) { min = j; } } int c = arr[min]; arr[min] = arr[i]; arr[i] = c; } }
---
(補充:還有一種排序叫做希爾排序,希爾排序是特殊的插入排序,通過將全部元素分為幾個區間來提高插入排序的效能,會選定一個步長,然後逐漸將步長縮短,當步長為1的時候,直接使用插入排序,參考:https://www.cnblogs.com/chengxiao/p/6104371.html)
---
測試方法及生成隨機陣列方法:
/**
* 生成一個長度5-10的隨機陣列
*
* @return 隨機陣列
*/
private static int[] initArray() {
int len = 5 + new Random().nextInt(6);
int[] arr = new int[len];
for (int i = 0; i < arr.length; i++) {
arr[i] = new Random().nextInt(100);
}
return arr;
}
public static void main(String[] args) {
int[] arr2 = initArray();
System.out.println("排序之前的陣列是:" + Arrays.toString(arr2));
selectionSort(arr2);
System.out.println("排序之後的陣列是:" + Arrays.toString(arr2));
}
---
測試結果,親測有效:
冒泡:
排序之前的陣列是:[95, 31, 52, 89, 6, 7, 55]
排序之後的陣列是:[6, 7, 31, 52, 55, 89, 95]
插入:
排序之前的陣列是:[5, 83, 56, 78, 38, 24, 70, 95]
排序之後的陣列是:[5, 24, 38, 56, 70, 78, 83, 95]
選擇:
排序之前的陣列是:[26, 1, 74, 16, 44, 28, 2]
排序之後的陣列是:[1, 2, 16, 26, 28, 44, 74]