归并排序涉及二分法思想并采用了递归函数(即分治算法),将待排序的数列按照先对做左半部分进行排序,再对右半部分进行排序,最后再归并到一个数组里。以前课上听了可是没有动手去写一写,觉得挺简单,可是现在想写却发现自己有许多的问题。现在终于都可以通过了 ,whatever 还是该总结下了
package homework;
import java.util.*;
import java.util.Arrays;
public class mergeSort {
static int[] mSort(int[] a,int l,int r){
int mid = (r+l)/2;
if(r>l){
int[] left = Arrays.copyOfRange(a, l, mid+1);
int[] right = Arrays.copyOfRange(a, mid+1, r+1);
left=mSort(left,0,left.length-1);
right=mSort(right,0,right.length-1);
return merge(a,left,right);
}
return a;
}
static int[] merge(int[] a,int[] b,int[] c){
int i=0,l=0,r=0;
while(l<b.length && r<c.length){
if(b[l]<=c[r]){
a[i++]=b[l++];
}
else{ a[i++]=c[r++];
}
}
while(l<b.length){ a[i++]=b[l++];}
while(r<c.length){ a[i++]=c[r++]; }
return a;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入数组大小:");
int N = input.nextInt();
int[] arr = new int[N];
System.out.println("请输入数组,用空格隔开数据:");
for(int i=0;i<N;i++){
arr[i]=input.nextInt();
}
arr=mSort(arr,0,arr.length-1);
for(int x: arr){
System.out.print(x+" ");
}
input.close();
}
}
刚开始遇到的问题是 就是把返回值设会VOID型没有改变原数组,再者就是调用到java的库函数Arrays.copyOfRange(a[],from,to);时没有搞清楚to是所要达到目标的后一下标值。本先要到达数组的最右端却一直只到达数组的右端前一个,导致排序结果一直不正确。
接着就是merge()的数组溢出问题,本先第一个循环里设了两个if语句,可是若要归并的数组里b和c里都只有一个数字,那么在第一个IF实现过后l++再比较b[l]与c[r]就会使得l下标越界的问题。最后这点小BUG改正后终于把归并排序写好了…
所以没事还是要多动动手…