扶我起来我还能敲几行 2021-03-31 14:07 采纳率: 100%
浏览 38
已采纳

一个让我非常疑惑的问题,恳请各路大佬抽空帮忙指点一下到底是哪里有问题!

小弟先上正确代码

#include <stdio.h>

//合体函数 
void heti(int *arr, int *temp, int left, int right, int mid)
{
    int i = left;
    int j = mid + 1;
    int t = 0;
    while(i <= mid && j <= right)
    {
        if(arr[i] >= arr[j])
        {
            temp[t++] = arr[j++];
        }
        else
        {
            temp[t++] = arr[i++];
        }
    }
    while(i <= mid)
    {
        temp[t++] = arr[i++];
    }
    while(j <= right)
    {
        temp[t++] = arr[j++];
    }
    for (i = 0; i < t; i++)
    {
        arr[left + i] = temp[i];
    }
}

//分开函数 
void fenkai(int *arr, int *temp, int left, int right)
{
    if(left < right)
    {
        int mid = (left + right) / 2;
        //向左进行递归分解
        fenkai(arr, temp, left, mid);
        fenkai(arr, temp, mid + 1, right); 
        //调用合体函数 
        heti(arr, temp, left, right, mid);
    }
}

int main()
{
    int n;
    scanf("%d", &n);
    int arr[n], temp[n];
    for(int i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    fenkai(arr, temp, 0, n - 1);
    for(int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
} 

问题描述:该问题是一个数组归并排序的代码,在合体函数的最后要把temp数组的元素全部复制到arr数组,为什么一定要arr[left + i] = temp[i],而不能直接用arr[i] = temp[i],我寻思我给left赋值就是赋的0啊,而且left的数据也没有变化,为什么两种方法却得到不一样的结果,下面附上两种方案的运行图片(第一个是对的,第二个是错的),跪求大佬告知!!!

展开全部

  • 写回答

1条回答 默认 最新

  • 幻灰龙 2021-03-31 15:17
    关注

    你在 heti (另外函数名尽量取英文名阿,merge 挺好)函数里打印下 left 的值就知道了,加一个 print

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

    好的,我这就试一试,谢谢大佬!

    回复
    幻灰龙 回复 扶我起来我还能敲几行 2021-03-31 15:41

    好用给采纳哈~~

    回复
编辑
预览

报告相同问题?

悬赏问题

  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部