sunxun123456 2022-07-16 23:03 采纳率: 50%
浏览 46
已结题

分治——合并free和溢出等众多错误

问题遇到的现象和发生背景

在学习合并排序时,仿写后自己写,发现free出问题了

问题相关代码,请勿粘贴截图

仿写代码

#include <stdio.h>
#include <stdlib.h>
void Merge(int *nums,int low,int high,int mid)
{
    int k=0;
    int *temp=(int*) malloc((high-low+1)*sizeof (int ));
    int i=low,j=mid+1;
    while(i<=mid&&j<=high) {
        if (nums[i] < nums[j])
            temp[k++] = nums[i++];
        else
            temp[k++]=nums[j++];
    }
    while (i<=mid)
        temp[k++] = nums[i++];
    while (j<=high)
        temp[k++]=nums[j++];
    for(int i=low,k=0;i<=high;i++)
        nums[i]=temp[k++];
    free(temp);
}
void MergeSort(int low,int high,int nums[])//分解
{
    if(low==high)
        return;
    int mid=(low+high)>>1;
    MergeSort(low,mid,nums);
    MergeSort(mid+1,high,nums);
    Merge(nums,low,high,mid);
}
void PrintArray(int *nums,int size)
{
    for(int i=0;i<size;i++)
        printf("%d ",nums[i]);
}
int main() {
    int nums[]={2,9,7,6,8,2,1};
    int len=sizeof (nums)/sizeof (int );
    MergeSort(0,len,nums);
    PrintArray(nums,len);
    return 0;
}


自己写

#include <stdio.h>
#include <stdlib.h>
void Merge(int *nums,int low,int mid,int high)
{
    int i=low,j=mid+1,k=0;
    int *temp= (int*) malloc((high-mid+1)*sizeof (int ));
    while (i<=mid&&j<=high)
    {
        if(nums[i]<nums[j])
            temp[k++]=nums[i++];
        else
            temp[k++]=nums[j++];
    }
    while (i<=mid)temp[k++]=nums[i++];
    while (j<=high)temp[k++]=nums[j++];
    for(int i=low,k=0;i<=high;i++)
        nums[i]=temp[k++];
    free(temp);
}
void MergeSort(int *nums,int low,int high)
{
    if(low==high)
        return;
    int mid=(low+high)>>1;
    MergeSort(nums,low,mid);
    MergeSort(nums,mid+1,high);
    Merge(nums,low,mid,high);
}
void PrintArray(int nums[],int len)
{
    for(int i=0;i<len;i++)
        printf("%d ",nums[i]);
}
int main() {
    int nums[]={2,9,7,6,8,2,1};

//   int i=0;
//    while(scanf("%d",&nums[i++]));
//    scanf("\n");
//    while(scanf("%d",&nums[i++]));
//    int len=--i;
    unsigned int len=sizeof (nums)/sizeof (int );
    MergeSort(nums,0,len);
    PrintArray(nums,7);
    return 0;
}


运行结果及报错内容

未报错

我的解答思路和尝试过的方法

去掉free可以输出结果,但没有达到理想结果;
在仿写的中加入同一组数据,数据溢出

我想要达到的结果
  • 写回答

2条回答 默认 最新

  • eq0284 2022-07-23 10:43
    关注
    获得3.70元问题酬金

    Divide-and-Conquer(P)

      1. if |P|≤n0

      2. then return(ADHOC(P))

      3. 将P分解为较小的子问题 P1 ,P2 ,…,Pk

      4. for i←1 to k

      5. do yi ← Divide-and-Conquer(Pi) △ 递归解决Pi

      6. T ← MERGE(y1,y2,…,yk) △ 合并子问题

      7. return(T)

      其中|P|表示问题P的规模;n0为一阈值,表示当问题P的规模不超过n0时,问题已容易直接解出,不必再继续分解。ADHOC(P)是该分治法中的基本子算法,用于直接解小规模的问题P。因此,当P的规模不超过n0时直接用算法ADHOC(P)求解。算法MERGE(y1,y2,…,yk)是该分治法中的合并子算法,用于将P的子问题P1 ,P2 ,…,Pk的相应的解y1,y2,…,yk合并为P的解。

    img

    评论

报告相同问题?

问题事件

  • 系统已结题 7月25日
  • 赞助了问题酬金10元 7月17日
  • 创建了问题 7月16日

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站