分而治之,归并排序
算法简单易懂,第一次编写错误,误把原数组下表当做临时数组考虑,结果可想而知,访问越界
下面是正确代码
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++];
while( i<arry1.length)
a[k++]=arry1[i++];
while( j<arry2.length)
a[k++]=arry2[j++];
}
#include <iostream>
using namespace std;
void merge(int a[],int p,int e,int m)
{
int *la= new int [m-p+1];
int *ra= new int [e-m];
int j=0;
int k=0;
int i=0;
for (i = p; i <= m; i++)
la[i-p]=a[i];
for (i = m+1; i <= e; i++)
ra[i-m-1]=a[i];
for (i= p; j<m-p+1&&k<e-m;i++)
if (la[j]<ra[k])
a[i]=la[j++];
else
a[i]=ra[k++];
while (j<m-p+1)
a[i++]=la[j++];
while (k<e-m)
a[i++]=ra[k++];
}
void mergesort(int a[], int p,int e)
{
int q=(p+e)/2;
if (e-1>=p)
{
mergesort(a,p,q);
mergesort(a,q+1,e);
merge(a,p,e,q);
}
}
int main(void)
{
const int n=10;
int a[n]={2,3,1,4,0,5,8,9,7,6};
mergesort(a,0,n-1);
for (int i = 0; i <n; i++)
cout<<a[i]<<" ";
cout<<endl;
}