标签:分治 空间 private out 比较 alt 快排 条件 算法
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
将两个的有序数列合并成一个更大的有序数列,我们称之为"归并"。
归并排序(Merge Sort)就是利用归并思想对数列进行排序。根据具体的实现,归并排序包括"从上往下"和"从下往上"2种方式。
两种排序的区别可以参考下面图片:
将两个数组合并为进行一次合并
@Test public void mergeSorBase() { // 初始化数组 // 两个子数组([0,2]和[3,5])都是有序的 int[] array = {4,5,6,2,3,9}; int[] temp = new int[array.length]; // 数组参数 int left = 0; int right = array.length - 1; int mid = (left + right) / 2; // 辅助循环 int i = left; // 左边数组的第一个元素 int j = mid + 1; // 右边数组的第一个元素 int index = 0; // 临时数组下标 // 循环比较两个数组的值, 直到其中一个数组遍历结束 while (i <= mid && j <= right) { if (array[i] < array[j]) temp[index++] = array[i++]; else temp[index++] = array[j++]; } // 取出左边数组剩余的元素 while (i <= mid) { temp[index++] = array[i++]; } // 取出右边数组剩余的元素 while (j <= right) { temp[index++] = array[j++]; } // 把临时数组中的值填充到原数组 for (int k = 0; k < index; k++) { array[left + k] = temp[k]; } // 打印数组元素 for (int t : array) { System.out.print(t); } }
所有的归并排序最终都依赖于上面的基础归并
@Test public void mergeSort() { // 初始化数组 int[] array = {4,5,1,6,2,3,7,9}; sort(array, 0, array.length - 1); // 打印数组元素 for (int t : array) { System.out.print(t); } } private void sort(int[] array, int left, int right) { if (left >= right) return; int mid = (left + right) / 2; // 排序左边的 sort(array, left, mid); // 排序右边的 sort(array, mid + 1, right); // 合并两边数组 merge(array, left, mid, right); } private void merge(int[] array, int left, int mid, int right) { int[] temp = new int[array.length]; int i = left; int j = mid + 1; int ti = 0; // 合并数组, 会有一个数组会剩余元素 while (i <= mid && j <= right) { if (array[i] < array[j]) { temp[ti++] = array[i++]; } else { temp[ti++] = array[j++]; } } // 如果左边剩余元素 while (i <= mid) { temp[ti++] = array[i++]; } // 如果右边剩余元素 while (j <= right) { temp[ti++] = array[j++]; } // 将临时数组的值, 对应到原数组 for (int k = 0; k < ti; k++) { array[left + k] = temp[k]; } }
参考:https://www.cnblogs.com/skywang12345/p/3602369.html
标签:分治 空间 private out 比较 alt 快排 条件 算法
原文地址:https://www.cnblogs.com/wuqinglong/p/9376478.html