C語言中qsort()庫函數的排序應用

C語言中不像C++一樣有sort(arr.begin(),arr.end(),cmp)排序接口,但是也提供類似的庫函數。

1. 首先要包含頭文件<stdlib.h>

2. 對於一維整型數組

函數指針定義:

int cmp_int(const void *a, const void *b) {
    int *_a = (int *)a;
    int *_b = (int *)b;
    return *_a - *_b;
}

main函數調用:

int main()
{
    int num[10] = {1, 6, 3, 9, 1, 6, 5, 2};
    qsort(num, 10, sizeof(int), cmp_int);
    for (int i = 0; i < 10; ++i)
        printf("%d ", num[i]);
    printf("\n");
    return 0;
}

3. 對於二維整型數組

函數指針定義(對於非malloc申請的多維數組):

int cmp_intTwo(const void *a, const void *b) {
    if (((int *)a)[0] != ((int *)b)[0])
        return ((int *)a)[0] - ((int *)b)[0];
    else return ((int *)a)[1] - ((int *)b)[1];
}

函數指針定義(對於malloc申請的多維數組):

int cmp_intTwoExtend(const void *a, const void *b)
{
    int *_a = *(int **)a;
    int *_b = *(int **)b;
    if (_a[0] != _b[0]) return _a[0] - _b[0];
    else return _a[1] - _b[1];
}

main函數調用(對於非malloc申請的多維數組):

int main()
{
    int arr[5][2] = {{2, 1}, {1, 2}, {2, 2}, {1, 1}, {1, 3}};
    qsort(arr, 5, sizeof(arr[0]), cmp_intTwo);
    for (int i = 0; i < 5; ++i) {
        for (int j = 0; j < 2; ++j)
        printf("%d ", arr[i][j]);
        printf("\n");
    }
    return 0;
}

main函數調用(對於malloc申請的多維數組):

int main()
{
    int row = 3;
    int **arr1 = (int **) malloc(sizeof(int *) * row);
    for (int i = 0; i < 3; ++i) {
        arr1[i] = (int *) malloc(sizeof(int) * 2);
    }
    arr1[0][0] = 1, arr1[0][1] = 2;
    arr1[1][0] = 1, arr1[1][1] = 1;
    arr1[2][0] = 0, arr1[2][1] = 2;
    qsort(arr1, 3, sizeof(arr1[0]), cmp_intTwoExtend);
    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 2; ++j)
        printf("%d ", arr1[i][j]);
        printf("\n");
    }
    for (int i = 0; i < 3; ++i)
         free(arr1[i]);
    free(arr1);
    return 0;
}

4. 對於字符型數組

函數指針定義:

int cmp_char(const void *a, const void *b) {
    char *_a = (char *)a;
    char *_b = (char *)b;
    return *_a - *_b;
}

main函數調用:

int main()
{
    char ch[20] = {"iufdffsalkdj"};
    qsort(ch, strlen(ch), sizeof(char), cmp_char);
        printf("%s ", ch);
    return 0;
}

5. 對於字符串型數組

函數指針定義:

int cmp_string(const void *a, const void *b) {
    char *_a = *(char **)a;
    char *_b = *(char **)b;
    return strcmp(_a, _b);
}

main函數調用:

int main()
{
    char *str[10] = {"nidwufuh", "qdiuw", "xbdnwi", "aKDWHOW", "DUIQDQR"};
    qsort(str, 5, sizeof(char *), cmp_string);
    for (int i = 0; i < 7; ++i)
        printf("%s ", str[i]);
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章