前言
最近时间比较紧o(╥﹏╥)o,先简单把代码发一下,之后在完善吧,就当做一个简单的学习记录,激励一下自己,如果有什么错误,希望能在下面评论指正。
代码
package com.zero;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import static java.lang.System.exit;
/**
* 2021年9月2日14:58:45
* 归并排序-java实现
*/
public class MergeSort {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入数组长度:");
int n = Integer.valueOf(bf.readLine());
System.out.println("请输入数组");
String[] s = bf.readLine().split(" ");
int[] arr = new int[n];
if (n!=s.length){
System.out.println("输入错误!");
exit(0);
}else {
for (int i = 0;i<n;i++)
arr[i] = Integer.valueOf(s[i]);
}
merge_sort(arr,0,n-1);
for (int num:arr)
System.out.print(num+" ");;
}
//归并排序实现
private static void merge_sort(int[] arr, int l, int r) {
if (l>=r) return;
//找到这次循环中的中间值
int mid = l+r >> 1;
//分别递归左边和右边
merge_sort(arr,l,mid);
merge_sort(arr,mid+1,r);
//临时数组
int[] temp = new int[r-l+1]; //这里用r-l+1框定合适的数组长度
//归并
//三个指针,k是临时数组的指针,i,j分别对应此次递归中的前后两个部分数组
int k = 0, i = l, j = mid + 1;
//利用双指针,循环判断左右两边的数组中的元素值大小,
//并把较小的值先放入临时数组中
while(i <= mid && j <= r)
if (arr[i]<=arr[j]) temp[k++] = arr[i++];
else temp[k++] = arr[j++];
//因为每次递归中的两个数组中的比较可能会存在元素剩余
//所以需要额外的循环来将剩下的元素全部填入到临时数组中去
while(i <= mid) temp[k++] = arr[i++];
while(j <= r) temp[k++] = arr[j++];
//将临时数组中的值全部写入到元素组中去
for (i = l, j = 0; i <= r; i++, j++) arr[i] = temp[j];
}
}