当前位置: 代码迷 >> Java相关 >> 关于合并排序(数组越界)的问题
  详细解决方案

关于合并排序(数组越界)的问题

热度:336   发布时间:2006-05-23 22:06:00.0
关于合并排序(数组越界)的问题
import java.io.*;
public class MegerSort
{
public void meger(int a[],int left,int mid,int right)//将两个已经排好的数组合并成一个数组
{
int temp[]=new int[align=right];
int flag=left;
int i=left;
while(left<right)
{
if(left<=mid&&(mid>right||a[align=left]<=a[mid]))
temp[flag++]=a[left++];
else
temp[flag++]=a[mid++];
}
for(int k=i;k<=right;k++)
{
a[k]=temp[k];
//System.out.print(a[k]+"\t");
}
}
public void megersort(int a[],int left,int right)//合并排序
{
int mid=(left+right)/2;
if(left!=right)
{
megersort(a,left,mid);
megersort(a,mid+1,right);
meger(a,left,mid,right);
}
}
public static void main(String args[])
{
int a[]=new int[] {3,5,7,9,4,2,5,1,6};
MegerSort check=new MegerSort();
check.megersort(a,1,7);
for(int i=0;i<9;i++)
{
System.out.print(a[i]+"\t");
}
}
}
搜索更多相关的解决方案: 越界  int  public  java  import  

----------------解决方案--------------------------------------------------------

我想问上面的代码出错在哪里


----------------解决方案--------------------------------------------------------

public void meger(int a[],int left,int mid,int right)//将两个已经排好的数组合并成一个数组
{
int temp[]=new int[align=right]; ///// 此处用right作为数组大小不太好,用right - left + 1如何?right前面的数组空间浪费了。
int flag=left;
int i=left;

//////////////////////////////////////////////////////////////////////////////////////////////
while(left<right)
{
if(left<=mid&&(mid>right||a[align=left]<=a[mid]))
temp[flag++]=a[left++];
else
temp[flag++]=a[mid++];
}
整个while循环显得逻辑条理不清晰
//////////////////////////////////////////////////////////////////////////////////////////////
for(int k=i;k<=right;k++)
{
a[k]=temp[k];
//System.out.print(a[k]+"\t");
}
}


改正后的meger函数如下:

public void meger(int a[],int left,int mid,int right)//将两个已经排好的数组合并成一个数组
{
// int temp[]=new int[align=right];
int temp[] = new int[right - left + 1];

int i = left, j = mid + 1, k = 0;

while (i <= mid && j <= right)
{
if (a[i] < a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}

while (i <= mid)
temp[k++] = a[i++];

while (j <= right)
temp[k++] = a[j++];

for(i = 0, k = left;k <= right; k++)
{
a[k]=temp[i++];
}
}


----------------解决方案--------------------------------------------------------
while(left<right)
此处应该注意left是否已经越过mid.
----------------解决方案--------------------------------------------------------
谢谢`
我现在边学JAVA边学算法

我的算法和数据结构好差 所以补补`

谢谢帮忙`

----------------解决方案--------------------------------------------------------
  相关解决方案