005 快排qsort库函数的用法——“C”
文章目录
前言
Reference - C++ Reference (cplusplus.com)可在此网站查阅相关函数信息
提示:以下是本篇文章正文内容,下面案例可供参考
一、qsort快排函数是什么
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
1.qsort的参数
void qsort( void *base,
//指向待排序数的第一个元素
size_t num,
//待排序数的元素个数
size_t width, size_t表示无符号数
//每个元素的字节大小
int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
compare是一个指向操作者提供函数的指针,该函数比较两个数组元素并返回指定它们之间关系的值即 Value:>0,<0,=0给qsort这个库函数,由qsort内部自行实现排序的过程。
const void *elem1, const void *elem2观察两个数组元素的类型
void*表明无具体指针类型,需要操作者自身指明自己排序的是什么类型
qsort库函数所需要的头文件:
<stdlib.h> and <search.h> |
Return Value | Description |
< 0 | elem1 less than elem2 |
0 | elem1 equivalent to elem2 |
> 0 | elem1 greater than elem2 |
二、实现步骤
int cmp_int(const void* p1, const void* p2)
{
return*(int*)p1 - *(int*)p2; //强制转换为int*类型,然后解引用得到整型数据
清楚的知道接下来是要比较2个整数的大小
}
void print_arr(int arr[], int sz) //打印排序好的数组元素
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
test1()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]); //计算数组元素的个数num
//使用qsort来排序整形数组,这里就要提供一个比较函数,这个比较函数能够比较2个整数的大小
//qsort 默认是排列成升序的
qsort(arr, sz, sizeof(arr[0]),cmp_int);
print_arr(arr,sz);
}
int main()
{
test1();
return 0;
}
struct stu //定义一个结构体包含name,age成员变量
{
char name[20];
int age;
};
按年龄排
int cmp_stu_by_age(const void* p1, constvoid* p2) //自定义一个函数返回两个元素的关系
{
return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
按名字排
int cmp_stu_by_name(const void* p1, constvoid* p2) //自定义一个函数返回两个元素的关系
{
return strcmp(((struct stu*)p1)->name , ((struct stu*)p2)->name);
//把p1强制类型转换成结构体指针,然后找到成员变量
}
void test2()
{
struct stu s[] = { {"zhangsan",30} ,{"lisi",25} ,{"wangwu",77} };
int sz = sizeof(s) / sizeof(s[0]); //数组元素的个数
qsort(s, sz, sizeof(s[0]), cpm_stu_by_age);
qsort(s, sz, sizeof(s[0]), cpm_stu_by_name);
}
int main()
{
//test1();
test2();
return 0;
}
屏幕录制 2023-03-31 221044
屏幕录制 2023-03-31 222015
strcmp返回值qsort所需要的参数一致
Value | Relationship of string1 to string2 |
< 0 | string1 less than string2 |
0 | string1 identical to string2 |
> 0 | string1 greater than string2 |