为什么我在 java 中出现异常合并排序?
why i am getting exception mergesort in java?
我无法理解为什么我得到 Exception.I 每个阶段的检查结果,但仍然找不到错误。
Temp 是一个数组,我想在其中添加要排序的元素。
A是一个数组,包含要排序的元素
打包应用程序;
public class MergeSortDemo
{
public static void mergesort(int A[],int temp[],int left,int right)
{
int mid;
if(right>left) //why u need to check this base case always
{
//System.out.println(right);
//System.out.println(left);
mid=(right+left)/2;
mergesort(A,temp,left,mid);
mergesort(A,temp,mid+1,right);
merge(A,temp,left,mid+1,right);
}
}
public static void merge(int A[],int temp[],int left,int mid,int right)
{
int i,left_end,size,temp_pos;
System.out.println(left);
System.out.println(right);
left_end=mid-1;
System.out.println(left_end);
temp_pos=left;
System.out.println(temp_pos);
size=right-left+1;
System.out.println(size);
while((left<=left_end)&&(mid<=right))
{
System.out.println(A[left]);
System.out.println(A[right]);
System.out.println(A[mid]);
if(A[left]<=A[mid])
{
temp[temp_pos]=A[left];
System.out.println(A[left]);
System.out.println("left in temp");
temp_pos=temp_pos+1;
left=left+1;
}
else
{
System.out.println(A[right]);
System.out.println("right in temp");
temp[temp_pos]=A[mid];
temp_pos=temp_pos+1;
mid=mid+1;
}
}
while(left<=left_end)
{
temp[temp_pos]=A[left];
System.out.println(A[left]);
System.out.println("left left");
left=left+1;
temp_pos=temp_pos+1;
}
while(mid<=right)
{
temp[temp_pos]=A[mid];
System.out.println(A[mid]);
System.out.println("right left");
mid=mid+1;
temp_pos=temp_pos+1;
}
for(i=0;i<size;i++)
{
A[right]=temp[right];
//System.out.println(A[right]);
right=right-1;
}
for(i=0;i<size;i++)
{
System.out.println(A[i]);
}
}
public static void main(String s[])
{
int ar[]={6,3,2,5,4};
int p[]=new int[ar.length];
mergesort(ar,p,0,ar.length-1);
}
}
OutPut 这里显示的是
0
1
0
0
2
6
3
3
3
堆栈跟踪
Exception in thread "main" right in temp
java.lang.ArrayIndexOutOfBoundsException: -1 //why
app.MergeSortDemo.merge(MergeSortDemo.java:81)
app.MergeSortDemo.mergesort(MergeSortDemo.java:19)
app.MergeSortDemo.mergesort(MergeSortDemo.java:17)
app.MergeSortDemo.mergesort(MergeSortDemo.java:17)
app.MergeSortDemo.main(MergeSortDemo.java:91)
你的 merge
方法中的这个循环看起来不对:
for(i=0;i<=size;i++)
{
A[right]=temp[right];
right=right-1;
}
例如,假设您使用 left=0,mid=1,right=1
.
调用合并
所以size = right-left+1=2
此循环将有 3 次迭代,right
将在最后一次迭代中达到 -1
,从而导致您的异常。
正确的循环可能是:
for(i=0;i<size;i++)
{
A[right]=temp[right];
right=right-1;
}
编辑:我刚刚对其进行了测试,这确实是问题所在。将 i<=size
更改为 i<size
后,您的代码会生成正确的排序数组:
[2, 3, 4, 5, 6]
我无法理解为什么我得到 Exception.I 每个阶段的检查结果,但仍然找不到错误。
Temp 是一个数组,我想在其中添加要排序的元素。
A是一个数组,包含要排序的元素 打包应用程序;
public class MergeSortDemo
{
public static void mergesort(int A[],int temp[],int left,int right)
{
int mid;
if(right>left) //why u need to check this base case always
{
//System.out.println(right);
//System.out.println(left);
mid=(right+left)/2;
mergesort(A,temp,left,mid);
mergesort(A,temp,mid+1,right);
merge(A,temp,left,mid+1,right);
}
}
public static void merge(int A[],int temp[],int left,int mid,int right)
{
int i,left_end,size,temp_pos;
System.out.println(left);
System.out.println(right);
left_end=mid-1;
System.out.println(left_end);
temp_pos=left;
System.out.println(temp_pos);
size=right-left+1;
System.out.println(size);
while((left<=left_end)&&(mid<=right))
{
System.out.println(A[left]);
System.out.println(A[right]);
System.out.println(A[mid]);
if(A[left]<=A[mid])
{
temp[temp_pos]=A[left];
System.out.println(A[left]);
System.out.println("left in temp");
temp_pos=temp_pos+1;
left=left+1;
}
else
{
System.out.println(A[right]);
System.out.println("right in temp");
temp[temp_pos]=A[mid];
temp_pos=temp_pos+1;
mid=mid+1;
}
}
while(left<=left_end)
{
temp[temp_pos]=A[left];
System.out.println(A[left]);
System.out.println("left left");
left=left+1;
temp_pos=temp_pos+1;
}
while(mid<=right)
{
temp[temp_pos]=A[mid];
System.out.println(A[mid]);
System.out.println("right left");
mid=mid+1;
temp_pos=temp_pos+1;
}
for(i=0;i<size;i++)
{
A[right]=temp[right];
//System.out.println(A[right]);
right=right-1;
}
for(i=0;i<size;i++)
{
System.out.println(A[i]);
}
}
public static void main(String s[])
{
int ar[]={6,3,2,5,4};
int p[]=new int[ar.length];
mergesort(ar,p,0,ar.length-1);
}
}
OutPut 这里显示的是
0
1
0
0
2
6
3
3
3
堆栈跟踪
Exception in thread "main" right in temp
java.lang.ArrayIndexOutOfBoundsException: -1 //why
app.MergeSortDemo.merge(MergeSortDemo.java:81)
app.MergeSortDemo.mergesort(MergeSortDemo.java:19)
app.MergeSortDemo.mergesort(MergeSortDemo.java:17)
app.MergeSortDemo.mergesort(MergeSortDemo.java:17)
app.MergeSortDemo.main(MergeSortDemo.java:91)
你的 merge
方法中的这个循环看起来不对:
for(i=0;i<=size;i++)
{
A[right]=temp[right];
right=right-1;
}
例如,假设您使用 left=0,mid=1,right=1
.
所以size = right-left+1=2
此循环将有 3 次迭代,right
将在最后一次迭代中达到 -1
,从而导致您的异常。
正确的循环可能是:
for(i=0;i<size;i++)
{
A[right]=temp[right];
right=right-1;
}
编辑:我刚刚对其进行了测试,这确实是问题所在。将 i<=size
更改为 i<size
后,您的代码会生成正确的排序数组:
[2, 3, 4, 5, 6]