分治——合并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可以输出结果,但没有达到理想结果;
在仿写的中加入同一组数据,数据溢出

我想要达到的结果

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

我只是单纯的好奇一下为什么用unsigned int定义len类型呢?你上面明明写的是int len,类型不统一对吧。