归并排序
//归并排序的时间复杂度为O(n*logn)
思路:一个数组,先让左半部分有序,
- 求中点 m
- l到m 有序
- m+1到r 有序
- merge
master公式
Merge过程
双指针,分别指向两个数组的第一个元素,哪个小放到新的数组中,并将指针后移(O(n))
实现代码
递归
public void mergeSort(int[] arr) {
if (arr == null || arr.length == 0) {
return;
}
process(arr, 0, arr.length - 1);
}
public void process(int[] arr, int l, int r) {
if (l == r) {
return;
}
int m = l + ((r - l) >> 1);
process(arr, l, m);
process(arr, m + 1, r);
merge(arr, l, m, r);
}
public void merge(int[] arr, int l, int m, int r) {
int[] helpArr = new int[r - l + 1];
int index = 0;
int l1 = l;
int r1 = m + 1;
while (l <= m && r <= r) {
helpArr[index++] = arr[l1] > arr[r1] ? arr[r1++] : arr[l1++];
}
while (l1 <= m) {
helpArr[index++] = arr[l1++];
}
while (r1 <= r) {
helpArr[index++] = arr[r1++];
}
for (int i = 0; i < helpArr.length; i++) {
arr[i + l] = helpArr[i];
}
}