分而治之,归并排序
算法简单易懂,第一次编写错误,误把原数组下表当做临时数组考虑,结果可想而知,访问越界
下面是正确代码
import java.util.Scanner; public class MergeSort { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner=new Scanner(System.in); int n=Integer.parseInt(scanner.next());; int []a=new int[n]; for (int i = 0; i < n; i++) { a[i]=Integer.parseInt(scanner.next()); } mergeSort(a,0,n-1); for (int i = 0; i < n; i++) { System.out.print(a[i]+" "); } } public static void mergeSort(int a[], int begin, int end) { if ((end-begin)>=1) { mergeSort(a, begin, begin+(end-begin)/2); mergeSort(a, begin+(end-begin)/2+1, end); merge(a, begin, begin+(end-begin)/2, end); } } public static void merge(int a[], int b, int m, int e) { int []arry1=new int[m-b+1]; //temporary array int []arry2=new int[e-m]; int i=b; int j=m+1; int k=0; for ( k = 0; k < arry1.length;) { arry1[k++]=a[i++]; } for ( k = 0; k < arry2.length;) { arry2[k++]=a[j++]; } i=0; j=0; for ( k = b; i<arry1.length&&j<arry2.length; k++) { if(arry1[i]<arry2[j]) { a[k]=arry1[i++]; } else { a[k]=arry2[j++]; } } for ( ; i<arry1.length; k++) { a[k]=arry1[i++]; } for ( ; j<arry2.length; k++) { a[k]=arry2[j++]; } } }
原文:http://blog.csdn.net/biruixing/article/details/38663473