1. 选择排序的递归实现
public static void chooseSortRecursion(int[] arr) {
recursion(arr, 0);
}
public static void recursion(int[] arr, int index) {
int N = arr.length;
if (index >= N - 1) return;
int min = index;
for (int i = index + 1; i < N; i++) {
if (arr[i] < arr[min]) {
exch(arr, i, min);
}
}
recursion(arr, ++index);
}
选择排序是从位置0开始选择最小的元素,每个位置的问题一样,只是问题的规模变小,可以选择递归。
从位置0到N - 2即可,因为到N - 1时只剩一个元素,不需要再选择。
2.插入排序的递归实现
public static void insertSortRecursion(int[] arr) {
recursion(arr, 1);
}
public static void recursion(int[] arr, int index) {
int N = arr.length;
if (index > N - 1) return;
for (int i = index; i > 0; i--) {
if (arr[i] < arr[i-1]) {
exch(arr, i-1, i);
}
}
recursion(arr, ++index);
}
3.复习一遍希尔排序
public static void shellSort(int[] arr) {
int N = arr.length;
int h = 1;
while (3*h + 1 <= N) h = 3*h + 1;
while (h >= 1) {
for (int i = h; i < N; i++) {
for (int j = i; j >= h; j -=h) {
if (arr[j-h] > arr[j]) {
exch(arr, j-h, j);
}
}
}
h = (h - 1) / 3;
}
}
public static void exch(int[] arr, int a, int b) {
if (a == b) return;
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}