publicstaticvoidselectionSort(int[] arr){ if (arr == null || arr.length <= 1) { return; } int n = arr.length; for (int i = 0; i < n; i++) { int minIndex = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } int temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } }
插入排序
将第 (i) 个元素插入左侧已有序区间:从 i-1 向左,大于 current 的元素后移,空位填入 current。逆序对数量与交换/移动次数相关,部分有序时很快。
时间:最坏 (O(n^2)),最好 (O(n))。
空间:(O(1))。
稳定性:稳定(向左扫描时用「严格小于」判断移动)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
publicstaticvoidinsertSort(int[] arr){ if (arr == null || arr.length <= 1) { return; } int n = arr.length; for (int i = 1; i < n; i++) { int current = arr[i]; int j = i - 1; while (j >= 0 && current < arr[j]) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = current; } }
publicstaticvoidheapSort(int[] arr){ if (arr == null || arr.length <= 1) { return; } int n = arr.length; for (int i = n / 2 - 1; i >= 0; i--) { heapify(arr, n, i); } for (int i = n - 1; i > 0; i--) { swap(arr, 0, i); heapify(arr, i, 0); } }
privatestaticvoidheapify(int[] arr, int heapSize, int i){ int largest = i; int left = 2 * i + 1; int right = 2 * i + 2; if (left < heapSize && arr[left] > arr[largest]) { largest = left; } if (right < heapSize && arr[right] > arr[largest]) { largest = right; } if (largest != i) { swap(arr, i, largest); heapify(arr, heapSize, largest); } }
源码中排序入口名为 dumpSort,与常见命名 heapSort 对应同一流程。
希尔排序
在插入排序基础上,按递减间隔 h 对子序列排序,最后 h=1 退化为插入排序。间隔序列不同,最坏复杂度上界不同,但实践中常优于 (O(n^2))。详见 CS-Notes 希尔排序。