内容来自刘宇波老师算法与数据结构体系课
1、归并排序
| |
| |
| |
| public class MergeSort { |
| |
| private MergeSort() { |
| } |
| |
| |
| |
| |
| public static <E extends Comparable<E>> void sort(E[] arr) { |
| sort(arr, 0, arr.length - 1); |
| } |
| |
| |
| |
| |
| private static <E extends Comparable<E>> void sort(E[] arr, int l, int r) { |
| if (l >= r) return; |
| |
| int mid = l + (r - l) / 2; |
| sort(arr, l, mid); |
| sort(arr, mid + 1, r); |
| |
| merge(arr, l, mid, r); |
| } |
| |
| |
| |
| |
| private static <E extends Comparable<E>> void merge(E[] arr, int l, int mid, int r) { |
| E[] temp = Arrays.copyOfRange(arr, l, r + 1); |
| |
| int p1 = 0; |
| int p2 = mid + 1 - l; |
| int i = l; |
| |
| while (p1 <= mid - l && p2 <= r - l) arr[i++] = temp[p1].compareTo(temp[p2]) <= 0 ? temp[p1++] : temp[p2++]; |
| while (p1 <= mid - l) arr[i++] = temp[p1++]; |
| while (p2 <= r - l) arr[i++] = temp[p2++]; |
| } |
| } |
2、归并排序优化
| |
| |
| |
| |
| |
| |
| public class MergeSortPlus { |
| |
| private MergeSortPlus() { |
| } |
| |
| |
| |
| |
| public static <E extends Comparable<E>> void sort(E[] arr) { |
| E[] temp = (E[]) new Comparable[arr.length]; |
| sort(arr, 0, arr.length - 1, temp); |
| } |
| |
| |
| |
| |
| private static <E extends Comparable<E>> void sort(E[] arr, int l, int r, E[] temp) { |
| if (r - l <= 15) { |
| InsertionSort.sort(arr, l, r); |
| return; |
| } |
| |
| int mid = l + (r - l) / 2; |
| sort(arr, l, mid, temp); |
| sort(arr, mid + 1, r, temp); |
| |
| if (arr[mid].compareTo(arr[mid + 1]) > 0) merge(arr, l, mid, r, temp); |
| } |
| |
| |
| |
| |
| private static <E extends Comparable<E>> void merge(E[] arr, int l, int mid, int r, E[] temp) { |
| System.arraycopy(arr, l, temp, l, r - l + 1); |
| |
| int p1 = l; |
| int p2 = mid + 1; |
| int i = l; |
| |
| while (p1 <= mid && p2 <= r) arr[i++] = temp[p1].compareTo(temp[p2]) <= 0 ? temp[p1++] : temp[p2++]; |
| while (p1 <= mid) arr[i++] = temp[p1++]; |
| while (p2 <= r) arr[i++] = temp[p2++]; |
| } |
| } |
3、自底向上归并排序
| |
| |
| |
| public class MergeSortBU { |
| |
| private MergeSortBU() { |
| } |
| |
| |
| |
| |
| public static <E extends Comparable<E>> void sort(E[] arr) { |
| int n = arr.length; |
| E[] temp = (E[]) new Comparable[n]; |
| |
| |
| for (int i = 0; i < n; i += 16) { |
| InsertionSort.sort(arr, i, Math.min(i + 15, n - 1)); |
| } |
| |
| |
| for (int size = 16; size < n; size += size) { |
| |
| for (int i = 0; i + size < n; i += 2 * size) { |
| if (arr[i + size - 1].compareTo(arr[i + size]) > 0) { |
| merge(arr, i, i + size - 1, Math.min(i + size + size - 1, n - 1), temp); |
| } |
| } |
| } |
| } |
| |
| |
| |
| |
| private static <E extends Comparable<E>> void merge(E[] arr, int l, int mid, int r, E[] temp) { |
| System.arraycopy(arr, l, temp, l, r - l + 1); |
| |
| int p1 = l; |
| int p2 = mid + 1; |
| int i = l; |
| |
| while (p1 <= mid && p2 <= r) arr[i++] = temp[p1].compareTo(temp[p2]) <= 0 ? temp[p1++] : temp[p2++]; |
| while (p1 <= mid) arr[i++] = temp[p1++]; |
| while (p2 <= r) arr[i++] = temp[p2++]; |
| } |
| } |
4、复杂度分析
元素个数为 N,那么:节点个数为 2N - 1,层数为 logN + 1


5、逆序数对
剑指 Offer 51 - 数组中的逆序对

| public class ReversePairs { |
| |
| |
| |
| |
| public static int reversePairs(int[] nums) { |
| return sort(nums); |
| } |
| |
| private static int sort(int[] arr) { |
| int[] temp = new int[arr.length]; |
| return process(arr, 0, arr.length - 1, temp); |
| } |
| |
| private static int process(int[] arr, int l, int r, int[] temp) { |
| |
| if (r - l <= 15) return insertionSort(arr, l, r); |
| |
| int mid = l + (r - l) / 2; |
| int left = process(arr, l, mid, temp); |
| int right = process(arr, mid + 1, r, temp); |
| |
| if (arr[mid] > arr[mid + 1]) return left + right + merge(arr, l, mid, r, temp); |
| return left + right; |
| } |
| |
| private static int merge(int[] arr, int l, int mid, int r, int[] temp) { |
| int res = 0; |
| System.arraycopy(arr, l, temp, l, r - l + 1); |
| |
| int p1 = l; |
| int p2 = mid + 1; |
| int i = l; |
| |
| while (p1 <= mid && p2 <= r) { |
| if (temp[p1] > temp[p2]) { |
| |
| |
| |
| |
| res += mid - p1 + 1; |
| arr[i++] = temp[p2++]; |
| } else { |
| arr[i++] = temp[p1++]; |
| } |
| } |
| while (p1 <= mid) arr[i++] = temp[p1++]; |
| while (p2 <= r) arr[i++] = temp[p2++]; |
| return res; |
| } |
| |
| private static int insertionSort(int[] arr, int l, int r) { |
| int res = 0; |
| for (int i = l + 1; i <= r; i++) { |
| int k = arr[i]; |
| int j; |
| for (j = i; j - 1 >= l && arr[j - 1] > k; j--) { |
| arr[j] = arr[j - 1]; |
| } |
| arr[j] = k; |
| res += i - j; |
| } |
| return res; |
| } |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步