title: 算法-归并排序
date: 2020-06-30 01:28:52
tags: Algorithm
category: Algorithm
对两个有序数组进行排序:
将arr数组中,左右两个有序数组分别复制到两个数组中,逐个比较,再放到原数组中,这样原数组有序。(或者利用双指针遍历,复制到一个新的数组中)
代码:
public void merge(int[] arr, int L, int R, int M) {
int leftSize = M - L;
int rightSize = R - M + 1;
int[] left = new int[leftSize];
int[] right = new int[rightSize];
for (int i = L; i < M; ++i)
left[i-L] = arr[i];
for (int j = M; j <= R; ++j) // j<=R 需要注意
right[j-M] = arr[j];
int i = 0, j = 0, k = L; // k=L 需要注意,不是0
while (i < leftSize && j < rightSize) {
if (left[i] < right[j])
arr[k++] = left[i++];
else
arr[k++] = right[j++];
}
while (i < leftSize)
arr[k++] = left[i++];
while (j < rightSize)
arr[k++] = right[j++];
}
对一组乱序数组进行排序:
递归,使数组的左右两个子数组有序,直至递归到左右两个数组都只有一个元素,然后再执行上面的merge操作。
代码:
public void mergeSort(int[] arr, int L, int R) {
if (L == R)
return;
else {
int M = (L + R) / 2;
mergeSort(arr, L, M);
mergeSort(arr, M + 1, R);
merge(arr, L, R, M + 1);
}
}
完整代码:
public class MergeSort {
/**
* 对两个有序的数组进行排序
* @param arr 排序的数组,L~M,M+1~R 之间是有序的
*/
public void merge(int[] arr, int L, int R, int M) {
int leftSize = M - L;
int rightSize = R - M + 1;
int[] left = new int[leftSize];
int[] right = new int[rightSize];
for (int i = L; i < M; ++i)
left[i-L] = arr[i];
for (int j = M; j <= R; ++j) // j<=R 需要注意
right[j-M] = arr[j];
int i = 0, j = 0, k = L; // k=L 需要注意,不是0
while (i < leftSize && j < rightSize) {
if (left[i] < right[j])
arr[k++] = left[i++];
else
arr[k++] = right[j++];
}
while (i < leftSize)
arr[k++] = left[i++];
while (j < rightSize)
arr[k++] = right[j++];
}
public void mergeSort(int[] arr, int L, int R) {
if (L == R)
return;
else {
int M = (L + R) / 2;
mergeSort(arr, L, M);
mergeSort(arr, M + 1, R);
merge(arr, L, R, M + 1);
}
}
public static void main(String[] args) {
int[] arr = {6, 3, 2, 7, 5, 1, 4, 0, 8, 9};
MergeSort sort = new MergeSort();
sort.mergeSort(arr, 0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
}