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");
}
}
}
----------------解决方案--------------------------------------------------------
我想问上面的代码出错在哪里
----------------解决方案--------------------------------------------------------
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边学算法
我的算法和数据结构好差 所以补补`
谢谢帮忙`
----------------解决方案--------------------------------------------------------