思路分析
归并排序,先将数组分为两并分别使用递归排好序,再依次遍历并比较两部分元素,按顺序存入辅助数组,(一个数组遍历完则将另一个还未遍历完的数组元素直接复制到辅助数组),最后将辅助数组中所有元素复制回原数组
代码实现
package DataStructures;
/**
* 归并排序, 先将数组分为两个部分,两个部分排好序,再依次遍历并比较两部分元素,按顺序
* 存入辅助数组,(一个数组早遍历完,另一个未遍历完的数组元素直接填入辅助数组)最后将
* 辅助数组中的元素复制回原数组
*/
public class Merge {
public static int[] process(int[] arr, int L, int R) {
if (L == R) {
return arr;
}
int mid = L + ((R - L) >> 1); // 中点
process(arr, L, mid);
process(arr, mid + 1, R);
return merge(arr, L, mid, R);
}
// 传入的参数为了将数组分为两部分
private static int[] 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++]; // 先将较小的复制到help中p1、2再加一进行移动
}
// 两种越界
// 右边越界,左边还有元素
while (p1 <= M) {
help[i++] = arr[p1++];
}
// 左边越界,右边还有元素
while (p2 <= R) {
help[i++] = arr[p2++];
}
// 将help中元素复制到原数组中
for (int j = 0; j < help.length; j++) {
arr[L + j] = help[j];
}
return arr;
}
}
测试代码
package DataStructuresTest;
import DataStructures.Merge;
public class MergeTest {
public static void main(String[] args) {
int[] arr = {3, 2, 6, 8, 5, 9};
int[] result = Merge.process(arr, 0, arr.length - 1);
for (int i : result) {
System.out.println(i);
}
}
}