我已经测试了合并方法并且它适用于所有情况但是不知何故mergeSort方法没有产生正确的输出,它只是将数组划分为更小的子数组然后将它传递给合并它们的方法。
public class MergeSort {
public static void main(String[] args) throws ArrayIndexOutOfBoundsException{
int a[]={2,4,5,7,1,2,3,6};
System.out.println("Unsorted Array");
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
int p=0,r=7;
try{
MergeSort m=new MergeSort();
m.mergeSort(a,0,7);
}
catch(Exception e )
{
e.printStackTrace();
}
System.out.println("\nSorted Array");
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
void mergeSort(int a[],int p,int r)
{
int q;
if(p<r)
{
q= (p+r)/2;
System.out.print(" "+q);
mergeSort(a,p,q);
mergeSort(a,q+1,r);
merge(a,p,q,r);
}
}
int [] merge(int a[],int p,int q,int r){
//int a[]={2,4,5,7,1,2,3,6};
int n1=q-p+2;
int n2=r-q+1;
int L[]=new int[n1];
int R[]=new int[n2];
for(int i=0;i<n1 -1;i++){
L[i]=a[i];
}
L[n1 -1] = Integer.MAX_VALUE;
//q=q+1;
for(int i=0;i<n2 -1;i++){
R[i]=a[q+i+1];
}
R[n2-1] = Integer.MAX_VALUE;
//L[n1+1]=9;
///R[n2+1]=9;
int i=0,j=0;
for(int k = p; k <= r; k++){
if(L[i] <= R[j]){
a[k] = L[i++];
}else{
a[k] = R[j++];
}
}
return a;
}
}
答案 0 :(得分:1)
对不起,您的合并方法在所有情况下都无法正常工作。在排序过程中,您使用参数merge()
,[2, 2, 4, 7, 1, 2, 3, 6]
,4
和4
致电5
。这应该保持数组不变,但它将数组更改为[2, 2, 4, 7, 2, 2, 3, 6]
- 有一个2,其中有1。
我认为错误存在于merge()
:
for(int i=0;i<n1 -1;i++){
L[i]=a[i];
}
你应该从索引a
开始从p
获取元素。相反,你从索引0开始。在前几次调用merge()
时,p
为0,所以没有区别,所以我理解你如何错过测试中的错误。稍后当p
为2或4时,事情就会出错。