【C言語】qsort関数

qsort

機能:クイックソートを実行します。

数:void qsort(void * base、size_t num、size_t width、int(* cmp)(const void * e1、const void * e2));

ヘッダーファイル:#include <stdlib.h>

使用法

最初のパラメーターは、ソートされる配列の最初の要素のアドレスです。

2番目のパラメーターは、ソートされるデータの数です。

3番目にキューに入れられたデータの各パラメーターのサイズ(バイト単位)

4つ目は、並べ替えるデータが大きいか小さいかを判別する関数を作成することです。規則は次のとおりです。

タイプvoid*のポインタは、任意のタイプのアドレスを受け取ることができます

void *型のポインタは逆参照できません(アクセスバイトは不確実です)

void *型のポインタは、整数に対して加算および減算演算を実行できません。

まず、簡単なアプリケーションとその結果を見てみましょう。

1.int型

#include <stdio.h>
#include <stdlib.h>
int cmp_int(const void* e1, const void* e2)
{
    //比较两个整型类型
    return *(int*)e1 - *(int*)e2;
}
int main()
{
    int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    qsort(arr, sz, sizeof(arr[0]), cmp_int);
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        printf("%d ",arr[i]);
    }
    return 0;
}

 

●ここを参照してください。これは昇順です。降順で降順にする場合は、 *(int *)e2-*(int *)e1 を直接返します。

●便宜上、各タイプのテストタイプテストを覚えています。たとえば、intタイプはtest1です。

2.フロートタイプ

int cmp_float(const void* e1, const void* e2)
{
    return *(float*)e1 - *(float*)e2;
}
void test2()
{
    float f[] = { 9.0,8.0,7.0,5.0,4.0 };
    int sz = sizeof(f) / sizeof(f[0]);
    qsort(f, sz, sizeof(f[0]), cmp_float);
    int j = 0;
    for (j = 0; j < sz; j++)
    {
        printf("%f ", f[j]);
    }
}
int main()
{
test2();
return 0;
}

3.struct型

構造体のメンバーには多くのタイプがある可能性があるため、ここでは比較的簡単な例のみを示します。構造体のメンバーには、名前と年齢のみが含まれています。qsortを使用して、年齢と名前で並べ替えます

struct Stu 
{
    char name[20];
    int age;
};

構造体-年齢

int cmp_Stu_by_age(const void*e1,const void*e2)
{
    return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}

void test3()
{
    struct Stu s[3] = { {"zhangsan",20},{"lisi",30},{"wangwu",18} };
    int sz = (sizeof(s) / sizeof(s[0]));
    qsort(s, sz, sizeof(s[0]), cmp_Stu_by_age);
    int z = 0;
    for (z = 0; z < sz; z++)
    {
        printf("%s %d", s[z].name,s[z].age);
    }
}
int main()
{
test3();
return 0;
}

構造体名

int cmp_Stu_by_name(const void* e1, const void* e2)
{
    return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
void test4()
{
    struct Stu s[3] = { {"zhangsan",20},{"lisi",30},{"wangwu",18} };
    int sz = (sizeof(s) / sizeof(s[0]));
    qsort(s, sz, sizeof(s[0]), cmp_Stu_by_name);
    int z = 0;
    for (z = 0; z < sz; z++)
    {
        printf("%s %d", s[z].name,s[z].age);
    }
}
int main()
{
test 4();
return 0;
}

 ここで注意すべき点があります。strcmp関数を使用して文字列を比較する必要があり、減算を直接実行することはできません。

 さて、今回はqsort関数については終わりました、親指を立ててください。

おすすめ

転載: blog.csdn.net/weixin_60478154/article/details/123167986