归并排序
程序员文章站
2022-05-10 17:19:14
...
//归并排序
public class MergeSort {
public static void mergeSort(int[] arr) {
if(arr == null || arr.length < 2) {
return;
}
mergeSort(arr, 0, arr.length - 1);
}
public 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);
}
public static void merge(int[] arr, int l, int m, int r) {
int[] help = new int[r - l + 1];
int i = 0;
int p1 = l;
int p2 = m+1;
while(p1 <= m && p2 <= r) {
help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
}
while (p1 <= m) {
help[i++] = arr[p1++];
}
while (p2 <= r) {
help[i++] = arr[p2++];
}
for(i=0; i < help.length; i ++) {
arr[l + i] = help[i];
}
}
}
思路:先让数组左边右边分别有序,再调用merge让整体有序。
merge过程会创建一个辅助数组,定义p1,p2两个指针分别指向左右第一个数,在比较两个指针指向的值,小的放进辅助数组,如果一个指针指向了末尾,则将另一个数组剩下的数全放进辅助数组。归并排序因为使用了一个辅助数组,故空间复杂度为O(N)
上一篇: win10怎么卸载更新?win10卸载更新的两种方法
下一篇: 醪糟产妇喝的做法大全有哪些?