标题:关于合并排序(数组越界)的问题
只看楼主
shiyide
Rank: 2
等 级:新手上路
威 望:4
帖 子:297
专家分:0
注 册:2006-2-22
 问题点数:0 回复次数:4 
关于合并排序(数组越界)的问题
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 
2006-05-23 22:06
shiyide
Rank: 2
等 级:新手上路
威 望:4
帖 子:297
专家分:0
注 册:2006-2-22
得分:0 

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


学好编程,为中国的软件事业出一份力。
2006-05-23 22:08
taurus850502
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-5-9
得分:0 

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++];
}
}

2006-05-24 01:04
taurus850502
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-5-9
得分:0 
while(left<right)
此处应该注意left是否已经越过mid.
2006-05-24 01:07
shiyide
Rank: 2
等 级:新手上路
威 望:4
帖 子:297
专家分:0
注 册:2006-2-22
得分:0 
谢谢`
我现在边学JAVA边学算法

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

谢谢帮忙`

学好编程,为中国的软件事业出一份力。
2006-05-24 17:43



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-66621-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.309419 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved