# 插入排序
public static int[] insertSort2(int[] arr) { if (arr.length < 2 || arr == null) { return arr; } // 假设刚开始数组中只存在一个数,从第二个数开始插入 for (int i = 1; i < arr.length; i++) { // 记录当前插入的数的值 int current = arr[i]; // 从当前数的前一位进行比较,一直比较到 arr[0] for (int j = i - 1; j >= 0; j--) { // 如果插入数小于比较数,比较数向后移动一位(index+1),插入数占据比较数的位置 if (arr[j] > arr[j + 1]) { arr[j + 1] = arr[j]; arr[j] = current; } } } return arr; }
# 选择排序
public static void selectSort(int[] arr) { if (arr.length == 1 || arr == null) { return; } for (int i = 0; i < arr.length; i++) { // 假设当前的数是最小数 int minIndex = i; // 向后遍历,找到最小的数 for (int j = i + 1; j < arr.length; j++) { if (arr[j] < arr[minIndex]) { // 如果遇到更小的数,让minIndex=它的index minIndex = j; } } // 当前数和最小数换位置 int temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } }
# 归并排序
public static void mergeSortRecur(int[] arr, int left, int right) { if (left == right) { return; } int mid = (left + right) / 2; mergeSortRecur(arr, left, mid); mergeSortRecur(arr, mid + 1, right); merge(arr, left, mid, right); } public static void mergeSortIter(int[] arr, int len) { int left, mid, right; for (int i = 1; i < len; i *= 2) { left = 0; while (left + i < len) { mid = left + i - 1; right = mid + i < len ? mid + i : len - 1; merge(arr, left, mid, right); left = right + 1; } } } private static void merge(int[] arr, int left, int mid, int right) { int[] tmp = new int[right - left + 1]; int i = left; int j = mid + 1; int index = 0; while (i <= mid && j <= right) { if (arr[i] < arr[j]) { tmp[index++] = arr[i++]; } else { tmp[index++] = arr[j++]; } } while (i <= mid) { tmp[index++] = arr[i++]; } while (j <= right) { tmp[index++] = arr[j++]; } for (int k = 0; k < tmp.length; k++) { arr[left++] = tmp[k]; } }