在学习合并排序时,仿写后自己写,发现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的解。
我只是单纯的好奇一下为什么用unsigned int定义len类型呢?你上面明明写的是int len,类型不统一对吧。