我已经在c中实现了合并排序,虽然代码似乎是正确的,代码不会给我排序的数组而是返回给它的相同数组,这意味着我的合并函数不能正常工作
#include<stdio.h>
#include<stdlib.h>
void re_sort(int arr[],int size);
void merge(int left[],int right[],int arr[],int rightlen,int leftlen);
int main(void)
{
int a[10];
int n;
printf("enter the number\n");
scanf("%d",&n);
printf("enter the elements\n");
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
re_sort(a,n); //merge sort using recursion
printf("the sorted list is:\n");
for(int i=0;i<n;i++)
{ printf("%d\t",a[i]);
}
return 0;
}
void re_sort(int arr[],int size)
{ int mid,*left,*right;
int k=0;
if(size<2)
return;
else
mid=size/2;
left=(int*)(malloc(mid*(sizeof(int)))); // two sub arrays left and right
right=(int*)(malloc((size-mid)*(sizeof(int))));
for(int i=0;i<mid;i++)
{
left[i]=arr[k++];
}
for(int j=0;j<(size-mid);j++)
{
right[j]=arr[k++];
}
re_sort(left,mid); //recursion until size becomes less than 2
re_sort(right,size-mid);
merge(left,right,arr,size-mid,mid); //both the elements in left and right are merged
}
void merge(int left[],int right[],int arr1[],int rightlen,int leftlen)
{ int arr[100];
int k=0,i=0,j=0;
while(i<leftlen && j<rightlen)
{
if(left[i]<= right[j])
arr[k++]=left[i++];
else
arr[k++]=right[j++];
}
while(i<leftlen)
{
arr[k++]=left[i++];
}
while(j<rightlen)
{
arr[k++]=right[j++];
}
for(int l=0;l<(rightlen+leftlen);l++)
{
arr1[l]=arr[l];
}
free(left);
free(right);
}
答案 0 :(得分:1)
下面
if(left[i]<= right[j])
arr[k++]=left[i++];
else
arr[k++]=left[j++];
上次left
应为right
。
无论如何,你在哪里free
记忆malloc
- ed ...?