簡體   English   中英

如何正確使用 qsort()?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM