扶我起来我还能敲几行 2021-03-31 22: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 23:17
    关注

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

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

报告相同问题?

悬赏问题

  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制