一、qsort的一般使用方法
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
//
//使用qsort对数组进行排序,升序
void test1()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
//bubble_sort(arr, sz);
//库函数中一个排序函数:qsort
qsort(arr, sz, sizeof(arr[0]), cmp_int);
//0 1 2 3 4 5 6 7 8 9
//打印
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
test1();
return 0;
}
int cmp_int()
cmp_int 是 qsort 所需的比较函数,用于比较两个 int 元素。 qsort 靠它决定元素顺序。其参数 e1 和 e2 为 void* 指针,需转为 int* 后解引用得实际 int 值。返回值 *(int*)e1 - *(int*)e2 依两元素大小关系,分别为负、0、正,符合 qsort 要求,实现升序排序。
void test1():
首先,定义并初始化一个整数数组 arr ,包含10个元素 {9, 8, 7, 6, 5, 4, 3, 2, 1, 0} 。
然后,计算数组的元素个数 sz 。 sizeof(arr) 返回整个数组的字节大小, sizeof(arr[0]) 返回数组中一个元素的字节大小,两者相除得到数组元素的个数。
调用 qsort 函数对数组 arr 进行排序。 qsort 函数的第一个参数是要排序的数组的起始地址,即 arr ;第二个参数是数组元素的个数 sz ;第三个参数是每个数组元素的大小,这里是 sizeof(arr[0]) ;第四个参数是比较函数的指针,即 cmp_int 。 qsort 函数会根据 cmp_int 函数的比较结果对数组进行排序。
最后,通过一个 for 循环遍历排序后的数组,并使用 printf 函数将每个元素打印出来。
二、使用qsort排序结构体
//一、使用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;
}
按名字来排序
//int cmp_stu_by_name(const void* e1, const void* e2)
//{
return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
//}
void test2()
{
struct Stu s[3] = { {"zhangsan",20}, {"lisi", 50}, {"wangwu", 33} };
int sz = sizeof(s) / sizeof(s[0]);
//qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}
int main()
{
test2();
return 0;
}
↑1、定义结构体 struct Stu
2、定义比较函数 int cmp_stu_by_age(const void* e1, const void* e2)
该函数借 qsort 排序结构体数组。 qsort 调用此函数比两结构体元素。 e1 、 e2 为 void* 指针,指向待比较元素。函数转其为 struct Stu* ,以 -> 访 age 成员,返回年龄差值,供 qsort 依差值正负定序,实现按年龄升序排序 。
3、test2() 函数的主要作用:是创建一个结构体数组,并使用 qsort 函数对其进行排序。