[英]How to properly use qsort()?
我正在嘗試編寫一個簡單的程序來查找數組的中位數。 為此,我嘗試使用 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));
}
除此之外,您使用代碼段獲得了錯誤的length
值
while(array[length]) // Array is not ended with zero
length++; // Length would get some unexpected value
您需要從函數median
返回double
並且還需要一個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]))
從qsort 文檔:
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
qsort() 函數使用大小為 size 的 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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.