코드가 올바른 것으로 보이지만 병합 정렬을 위해 구현되었습니다. 정렬 된 배열은 정렬 된 배열을 제공하지 않고 오히려 동일한 배열을 반환하므로 내 병합을 의미합니다. 여기병합 정렬을 사용하여 배열 정렬
if(left[i]<= right[j])
arr[k++]=left[i++];
else
arr[k++]=left[j++];
마지막 left
#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);
}
'의 도착 [1] = arr1 [L] ; ', 그 후에 ?? –
각 재귀 호출에서 메모리가 누출됩니다. – dragosht
배열에 포인터를 전달하지 않고 배열을 전달하고 있습니까? 따라서 실제로 어떤 값을 변경하지 않습니다. 내가 뭔가를 놓치지 않는 한, 전적으로 가능합니다. – Yann