如何正确使用qsort()?

时间:2014-09-10 14:51:17

标签: c arrays 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));
}

2 个答案:

答案 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)

来自qsort documentation

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;
}