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関数については終わりました、親指を立ててください。