haoaben 2015-12-05 04:35 采纳率: 100%
浏览 1676
已采纳

哪位大神知道我这个归并排序的代码究竟哪里出了问题?

代码如下:
找了好久,实在找不出哪里的问题:

 #include<stdio.h>
void merge(int s[],int a[],int start,int mid,int end) 
{
    int i=start;
    int j=mid+1;
    int k=start;
    while(i<=mid && j<=end) {
        if(a[i]<a[j]) {
            s[k++]=a[i++];
        } else {
            s[k++]=a[j++];
        }
    }
    if(i<=mid) {
        s[k++]=a[i++];
    }
    if(j<=end) {
        s[k++]=a[j++];
    }
}

void merge_sort(int s[],int a[],int start,int end) 
{
    int t[20]; 
    int mid; 
    if(start==end) {
        s[start]=a[start];
    } else {
        mid=(start+end)/2;
        merge_sort(t,a,start,mid);
        merge_sort(t,a,mid+1,end);
        merge(s,t,start,mid,end);
    }
}

int main()
{
    int i;
    int n=5;
    int a[n],s[n];
    printf("Enter %d nimbers: \n",n);
    for(i=0;i<n;i++) {
        scanf("%d",&a[i]);
    }
    printf("\n");
    merge_sort(s,a,0,n-1);
    printf("The sorted order is: \n");
    for(i=0;i<n;i++) {
        printf("%5d",s[i]);
    }
    printf("\n");
    return 0;
}
  • 写回答

4条回答 默认 最新

  • wunaidepao 2015-12-05 08:06
    关注

    我看到你这个问题,刚开始还以为是二分法,摸了半天瞎。后来发现时归并排序,然后我发现我也不会,就调你的程序,查资料什么事归并排序。
    然后发现其实问题很简单,
    while(i<=mid) {
    s[k++]=a[i++];
    }
    while(j<=end) {
    s[k++]=a[j++];
    }
    这个地方粗一看觉得是对的,但是后来我细想,要是1个排序的数组:4 5 3。然后经过你的这段程序,
    while(i<=mid && j<=end) {
    if(a[i]<a[j]) {
    s[k++]=a[i++];
    } else {
    s[k++]=a[j++];
    }
    }

    Enter 5 nimbers:
    5 4 3 2 1

    0-4
    0-2
    0-1
    0-0
    1-1
    0 0 1
    4 5 0 0 0
    2-2
    0 1 2
    3 4 0 0 0
    3-4
    3-3
    4-4
    3 3 4
    3 4 0 1 2
    0 2 4
    1 2 3 0 0
    The sorted order is:
    1 2 3 0 0
    第一次,把三排到最开始,i ++ 了,while就退出了,这是还有4 5没有合并,然后你下面的是if(),这就造成,最多只能加一个元素的情况,把5给
    丢了。现在是3 4,然后合并了 1 2,成了 3 4 0 1 2,在排序的时候,把 1 2 先拍, 这时候while退出,然后 就合并了一个 3 , 4 给丢了。换成 while
    就行了。还有,定义数组要规范,然后还要初始化,这是规范化操作。我贴上了测试的数据。不知道你看不看得懂。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。