分治法的基本思想是分而治之,分治法的三要素为
1.分解子问题
2.对子问题求解
3.合并子问题解
实现合并排序的一般方法是:
比较两个序列中的最小值,输出其中的较小值,然后重复此过程,知道一个序列为空时,如果另一个还有元素为输出,则将剩余元素依次输出就可以了.下面是合并流程:
对合并排序而言,我们将待排序的元素序列一分为二,得到两个长度基本相等的子序列,类似二分查找的做法,然后对两个子序列分别排序,如果序列较长,还可继续细分,直到子序列的长度不超过1为止;当分解所得的子序列已排列有序时.可以采用上面介绍的方法,将两个有序序列合并成一个有序子序列,实现将子问题解合成原问题解.
分解过程和合并过程为:
代码:
class Solution { int[] tmp;
public int[] sortArray(int[] nums) { tmp = new int[nums.length]; mergeSort(nums, 0, nums.length - 1); return nums; } public void mergeSort(int[] nums, int l, int r) { if (l >= r) { return; } int mid = (l + r) >> 1; mergeSort(nums, l, mid); mergeSort(nums, mid + 1, r); int i = l, j = mid + 1; int cnt = 0; while (i <= mid && j <= r) { if (nums[i] <= nums[j]) { tmp[cnt++] = nums[i++]; } else { tmp[cnt++] = nums[j++]; } } while (i <= mid) { tmp[cnt++] = nums[i++]; } while (j <= r) { tmp[cnt++] = nums[j++]; } for (int k = 0; k < r - l + 1; ++k) { nums[k + l] = tmp[k]; } }
}
这是力扣官方的题解. 链接:力扣