我正在尝试编写一个简单的程序来查找数组的中位数。为了做到这一点,我首先尝试使用qsort将我的值按顺序排列,但我无法让它工作。我相信它与我的函数参数和指针有关。
#include <stdio.h>
#include <stdlib.h>
int cmpfunc (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int median(const int* array)
{
double median;
int length =0;
while(array[length])
length++;
qsort(*array, length, sizeof(int), cmpfunc);
if(length %2 ==0)
{
median=(array[length/2] + array[(length/2)+1])/2;
}
else
{
median = array[(length +1/2)];
}
return median;
}
int main ()
{
int array [] = {5, 3, 2, 7, 9};
printf( "%f", median(array));
}
答案 0 :(得分:1)
除此之外,length
使用代码段
while(array[length]) // Array is not ended with zero
length++; // Length would get some unexpected value
您需要从函数double
返回median
,并且还需要为length
添加一个参数。
double median(int* array, const int length){...}
// ^Removed const qualifier and added an extra parameter for array size
将median
称为
double result = median(array, sizeof(array)/sizeof(array[0]))
答案 1 :(得分:1)
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
qsort()函数使用大小为nmemb的元素对数组进行排序。 base参数指向数组的开头。
首先你需要确定正确的长度;第二,在您qsort
的原始电话中,您使用的qsort(*array...)
不是您想要的。只需使用qsort(array...)
。
在编写这些小测试以查看实际数据时也很有用;您可以使用调试器,也可以打印出阵列中的内容。
#include <stdio.h>
#include <stdlib.h>
int cmpfunc(const void *a, const void *b)
{
return (*(int *) a - *(int *) b);
}
void printArray(int *array, int length)
{
int i;
for (i = 0; i < length; i++) {
printf("%d ", array[i]);
}
printf("\n");
}
int median(int *array, int length)
{
double median;
printArray(array, length);
qsort(array, length, sizeof(int), cmpfunc);
printArray(array, length);
if (length % 2 == 0) {
median = (array[length / 2] + array[(length / 2) + 1]) / 2;
} else {
median = array[(length + 1 / 2)];
}
return median;
}
int main()
{
int array[] = { 5, 3, 2, 7, 9 };
printf("%d\n", median(array, sizeof(array) / sizeof(array[0])));
return 0;
}