我非常仔细地遵循了所有算法步骤,但仍然总是输出错误的答案。我不明白为什么。我认为合并算法中出现了一些错误,导致了这一点,但无法确定是什么。请帮忙。如果有任何可以改进的代码,请建议。
谢谢
INPUT - {5,6,1,8,9,7}
输出 - {1,0,7,0,9,7}
#include<stdio.h>
#include<malloc.h>
void mergeSort(int array[],int length);
void merge(int *leftArray,int *rightArray,int *array);
void main()
{
int array[] = {5,6,1,8,9,7};
int length_of_array;
length_of_array = sizeof(array) / sizeof(array[0]);
mergeSort(array,length_of_array);
int i;
for(i=0;i<length_of_array;i++)
{
printf("%d->",array[i]);
}
}
void mergeSort(int array[],int length)
{
if(length < 2)
return;
int mid;
int i;
mid = length/2;
int *leftArray, *rightArray;
leftArray = (int*)malloc(mid*sizeof(int));
rightArray = (int*)malloc((length-mid)*sizeof(int));
for(i=0;i<mid;i++)
leftArray[i] = array[i];
for(i=mid;i<length;i++)
rightArray[i-mid] = array[i];
mergeSort(leftArray, mid);
mergeSort(rightArray, length-mid);
merge(leftArray,rightArray,array);
}
void merge(int *leftArray,int *rightArray,int *array)
{
int i,j,k;
i = j = k = 0;
int leftSize = sizeof(leftArray)/sizeof(leftArray[0]);
int rightSize = sizeof(rightArray)/sizeof(rightArray[0]);
while(i < leftSize && j < rightSize)
{
if(leftArray[i]<rightArray[j])
{
array[k] = leftArray[i];
k = k + 1;
i = i + 1;
}
else
{
array[k] = rightArray[j];
k = k + 1;
j = j + 1;
}
}
while(i<leftSize)
{
array[k] = leftArray[i];
k = k + 1;
i = i + 1;
}
while(j<rightSize)
{
array[k] = rightArray[j];
k = k + 1;
j = j + 1;
}
}
答案 0 :(得分:3)
正如@molbdnilo所评论的那样,你无法从指针参数中获得数组的大小。因此merge
需要获取左右数组的长度以及指向它们的指针。
问题是C中的数组不是完整的&#39;数据类型,而只是一个方便的语法。在merge
函数中,参数int *leftArray
正是它所说的 - 指向整数的指针。所以sizeof
会告诉你指针的大小。在main
函数中,array
已知是一个数组,其长度是已知的(从给定的初始值开始),因此sizeof
可以给出分配给它的实际内存大小变量。但是这个大小并没有存储在变量的任何地方,所以它不会被传递到merge
- 唯一传入的是指向内存块的指针。
此外,虽然在这种情况下它不会给您带来问题,但您应该free
leftArray
和rightArray
指针malloc
。这样,您可以在实际应用程序中使用排序功能而不会泄漏内存。