问题遇到的现象和发生背景
在学习合并排序时,仿写后自己写,发现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可以输出结果,但没有达到理想结果;
在仿写的中加入同一组数据,数据溢出