请大神帮我看看这个归并排序错在哪里???

privatevoidmergeSort(int[]a){intn=a.length;int[]b=null,c=null;while(n>1){b=newint[n/2... private void mergeSort(int[] a) {

int n = a.length;
int[] b = null, c = null;
while (n > 1) {
b = new int[n / 2];
c = new int[n - n / 2];

for (int i = 0, j = 0; i < n; i++) {
if (i < n / 2) {
b[i] = a[i];
} else {
c[j] = a[i];
j++;
}
}

mergeSort(b);
mergeSort(c);
merge(b, c, a);
}

}

private void merge(int[] b, int[] c, int[] a) {

int i = 0, j = 0, k = 0;
while (i < b.length && j < c.length) {
if (b[i] < c[j]) {
a[k] = b[i];
i++;
} else {
a[k] = c[j];
j++;
}
k++;
}

if (i == b.length) {
for (; j < c.length; j++, k++) {
a[k] = b[j];
}
} else {
for (; i < b.length; i++, k++) {
a[k] = b[i];
}
}
}
展开
 我来答
灵枝怡m
2014-03-25 · TA获得超过114个赞
知道小有建树答主
回答量:130
采纳率:47%
帮助的人:55.4万
展开全部

1、错误在于递归调用中使用的while错误使用和部分逻辑不严格。

2、方法mergeSort方法在自身方法体中被调用是典型的递归用法,递归调用包含类似while的功能。B部分的while因为没有终结限制(n没有递减)造成了程序的死循环。给方法应在A出添加数组返回值,去掉B处的while代之以if(a<2){return a}的终结条件,把merge方法的返回值作为该方法的返回值。

3、D处的a[k]=b[j]应该为a[k]=c[j]。merge方法应添加返回int[]数组类型,返回a[]

追问
真的很感谢,我纠结了很久居然然没有想到返回值,真不好意思,还犯了一些低级错误。。。while(n>1)循环应该没有问题吧,因为n是数组长度
追答
1、每一次递归调用都相当与单独执行一次mergeSort方法。根据你的程序假设一个分支n的值为8、4、2,则第一次调用mergeSort方法时n=8,因为在再次递归之前(调用mergeSort)n的值在循环中没有递减所以while循环就会死循环。
2、你可以使用eclipse调试模式看下。
网易云信
2023-12-06 广告
网易云信提供一站式的 1 对 1 UIKit 组件库,可以更快地搭建 1 对 1 社交平台,能够快速实现音视频呼叫、音视频通话、1对1消息发送、美颜和礼物功能,直接可以复用我们的组件源码就可以了。优势:1、全套1对1 UI组件,接入更快;2... 点击进入详情页
本回答由网易云信提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式