//归并排序
#include <stdio.h>
int b[10];
void merge(int *a,int low,int mid,int high)
{
int i,j,k;
for(k=low;k<=high;k++)
b[k++]=a[k++];
i=low;
j=mid+1;
k=low;
while(i<=mid&&j<=high)
{
if(b[i]<=b[j]) a[k++]=b[i++];
else a[k++]=b[j++];
}
while(i<=mid)
{
a[k++]=b[i++];
}
while(j<=high)
{
a[k++]=b[j++];
}
// return b;
}
void mergesort(int *a,int low,int high)
{
if(low<high)
{
int mid=(low+high)/2;
mergesort(a,low,mid);
mergesort(a,mid+1,high);
merge(a,low,mid,high);
}
}
int main()
{
int a[10]={7,4,1,8,5,2,9,6,3,10};
//int *b=NULL;
mergesort(a,0,9);
for(int i=0;i<10;i++)
printf("%d ",a[i]);
}
c语言归并排序找错误
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
5条回答 默认 最新
- Kwan的解忧杂货铺@新空间代码工作室 2024-03-02 20:32关注
2302_79644694 晚上好🌙🌙🌙
本答案参考ChatGPT-3.5错误:
- 在merge函数的for循环中,k的自增应该是k++而不是k+=2。因为已经在循环中自增了一次,所以不需要再自增一次。
- 在merge函数的for循环中,b数组的赋值应该是b[k]=a[k]而不是b[k++]=a[k++]。因为k已经在循环中自增了一次,所以不需要再自增一次。
- merge函数中的while循环条件应该是i<=mid&&j<=high而不是i<=mid||j<=high。因为归并排序是要同时比较两个子数组的元素进行排序。
- mergesort函数的将数组划分为两个子数组的中点计算应该是mid=(low+high)/2而不是mid=(low+high)/2+1。因为需要保证左右两个子数组的长度一致。
- 在主函数main中,调用mergesort函数传入的数组长度应该是9而不是10。因为数组下标是从0开始的。
修改后的代码如下:
//归并排序 #include <stdio.h> int b[10]; void merge(int *a,int low,int mid,int high) { int i,j,k; for(k=low;k<=high;k++) b[k]=a[k]; i=low; j=mid+1; k=low; while(i<=mid&&j<=high) { if(b[i]<=b[j]) a[k++]=b[i++]; else a[k++]=b[j++]; } while(i<=mid) { a[k++]=b[i++]; } while(j<=high) { a[k++]=b[j++]; } } void mergesort(int *a,int low,int high) { if(low<high) { int mid=(low+high)/2; mergesort(a,low,mid); mergesort(a,mid+1,high); merge(a,low,mid,high); } } int main() { int a[10]={7,4,1,8,5,2,9,6,3,10}; mergesort(a,0,9); for(int i=0;i<10;i++) printf("%d ",a[i]); }
解决 无用评论 打赏 举报
悬赏问题
- ¥15 请各位帮我看看是哪里出了问题
- ¥15 vs2019的js智能提示
- ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
- ¥15 uniapp的h5项目写一个抽奖动画
- ¥15 hadoop中启动hive报错如下怎么解决
- ¥15 如何优化QWebEngineView 加载url的速度
- ¥15 关于#hadoop#的问题,请各位专家解答!
- ¥15 如何批量抓取网站信息
- ¥15 Spring Boot离线人脸识别
- ¥15 使用Ant Design Pro vue的时候,使用环境变量的时候,构建报错是什么原因