1. 程式人生 > >C語言中庫函式自帶的排序函式qsort

C語言中庫函式自帶的排序函式qsort

之前一直不知道C語言還有預設的排序函式,而且還是快速排序的函式,當時覺得自己C語言白學了,瞭解之後我覺得應該把這個函式的用法和用例展示出來,供大家參考。

#include <stdlib.h>

void qsort( void *buf, size_t num, size_t size, int (*compare)(const void *, const void *) );

功能:buf 指向的資料(包含num 項,每項的大小為size)進行快速排序。如果函式compare 的第一個引數小於第二個引數,返回負值;如果等於返回零值;如果大於返回正值。函式對buf 指向的資料按非降序排序。

要用這個函式,我們只需要自己實現compare這個函式即可,但是要滿足函式規定的功能。

下面是我的實現程式碼:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int compare(const void *value1, const void *value2);
void printArray(int *array, int size);

int main(int argc, char const *argv[])
{
    int size = 0;
    scanf("%d", &size);
    assert(size > 0);

    int *array = (int *)calloc(size, sizeof(int));
    int i = 0;
    for (i = 0; i < size; ++i) {
        scanf("%d", &array[i]);
    }

    qsort(array, size, sizeof(int), compare);
    printArray(array, size);

    free(array);
    return 0;
}

int compare(const void *value1, const void *value2) 
{
    return *(int*)value1 - *(int*)value2;
}

void printArray(int *array, int size)
{
    assert(array != NULL && size > 0);
    
    int i = 0;
    for (i = 0; i < size; ++i) {
        printf("%d ", array[i]);
    }
    printf("\n");
}

當然,這個qsort函式能實現的排序不只是對int型的陣列,它還可以對浮點數、資料結構進行排序,只要你自己實現相應的compare函式即可。

預設情況下qsort函式是按非降序進行排序,但是,如果你想要讓陣列按非升序的方式排序,那隻需把compare函式的返回值更改成與原先相反即可,也就是如果函式compare 的第一個引數小於第二個引數,返回正值;如果等於返回零值;如果大於返回負值。各位有興趣可以嘗試一下。