算法步骤
通过sort方法将数组分成两份,并不停的递归直至数组大小为1,然后通过merge方法将两个数组合并排序,并不停递归回去,直至数组排序完成。
代码实现
sort方法:不停的将数组分成两组,直至数组大小为1,然后通过merge排序,并不停递归回去,直至数组排序完成
public int[] sort(int[] sourceArray) throws Exception {
//对 arr 进行拷贝,不改变参数内容
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
if(arr.length < 2) {
return arr;
}
int middle = (int) Math.floor(arr.length / 2);
int[] left = Arrays.copyOfRange(arr, 0, middle);
int[] right = Arrays.copyOfRange(arr, middle, arr.length);
return merge(sort(left), sort(right));
}
merge方法:比较两组数组,并将两组数组排序并合并
protected int[] merge(int[] left, int[] right) {
int[] result = new int[left.length + right.length];
int i = 0;
while(left.length > 0 && right.length > 0) {
if(left[0] <= right[0]) {
result[i++] = left[0];
left = Arrays.copyOfRange(left, 1, left.length);
}else {
result[i++] = right[0];
right = Arrays.copyOfRange(right, 1, right.length);
}
}
while(left.length > 0) {
result[i++] = left[0];
left = Arrays.copyOfRange(left, 1, left.length);
}
while(right.length > 0) {
result[i++] = right[0];
right = Arrays.copyOfRange(right, 1, right.length);
}
return result;
}
主方法,验证代码是否正确
public static void main(String[] args) throws Exception {
int[] arr = {50,15,56,23,54,84,58,45,21};
MergeSort mergeSort = new MergeSort();
int[] result = mergeSort.sort(arr);
System.out.print("排序后的数组为:");
for(int num:result) {
System.out.print(num+" ");
}
}