思想
用递归思想将数组等分为左右两数组,从底层递归开始使左右子数组有序。
递归策略
申请空间,使其大小为两个已经排序序列之和(最底层递归子数组必然只有一个元素,可视为有序序列),该空间用来存放合并后的序列;
设定两个指针,最初位置分别为两个已经排序序列的起始位置;
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
重复步骤3直到某一指针超出序列尾;
将另一序列剩下的所有元素直接复制到合并序列尾;
代码
private static void mergeSort(int[] arr, int l, int r) {
if (l == r){
return;
}
int mid = l + ((r-l) >> 1);
mergeSort(arr, l,mid);
mergeSort(arr, mid + 1, r);
merge(arr, l, mid, r);
}
private static void merge(int[] arr, int l, int mid, int r) {
int[] help = new int[r - l + 1];
int i = 0;
int p1 = l;
int p2 = mid + 1;
while (p1 <= mid && p2 <=r){
help[i++] = arr[p1] >= arr[p2] ? arr[p2++] : arr[p1++];
}
while (p1 <= mid){
help[i++] = arr[p1++];
}
while (p2 <= r){
help[i++] = arr[p2++];
}
for (int j = 0; j < help.length; j++) {
arr[l+j] = help[j];
}
}
时间复杂度O(NlogN);
额外空间复杂度O(N);
具有稳定性;