题目描述:
归并排序需要一个额外的数组aux,大小与原数组的大小相等。
题目要求aux数组的大小为原数组的一半便可以实现归并排序。
思路: 数组aux只用来保存原数组的前一半元素,即[lo : mid], 另一半 [mid+1: hi]无需复制。
merge过程遇到的可能情况:
- lo > mid : 左半部分的数组已经归并完毕,只剩下右半部分,由于右半部分已经在原数组,可以直接break。
- rec > hi : 右半部分的数组已经归并完毕,只剩下左半部分,将左半部分剩下的元素全部复制回原数组。
- a[rec] < temp[lo] : 左边元素比右边元素大,将右边的元素复制回原数组。
- a[rec] >= temp[lo] : 右边的元素大于或等于左边的元素,将左边元素复制回原数组。
代码
public class MergingWithSmallerAuxiliaryArray {
private static void merge(int []temp, int []a, int lo, int mid, int hi) {
//cooy
for (int i = lo; i <= mid; i++)
temp[i] = a