大家好,我是十七,今天分享qsort函数的简单使用
(1) qsort是一个库函数,头文件是#include
(2) qsort是基于快速排序算法的排序函数
void qsort (void* base,
size_t num,
size_t size,
int (*compare)(const void* a,const void* b));
//1. base即为数组名,表示的是数组首元素的地址
//2. num表示的是数组中元素的个数
//3. size表示的数组中每个元素的字节大小
//4. a和b作为形参,接收的是数组中的两个不同元素
**//这里需要注意的是:compare是需要自己进行创建的一个函数**
**//然后把compare函数作为qsort的一个参数**
**//其中,整个compare就是基于快速排序逻辑的一个函数**
直接上代码:
#include
#include
int compare(const void* a, const void* b);
int main(void)
{
int arr[] = { 9,7,8,4,5,6,1,2,3,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr,sz, sizeof(int), compare);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
int compare(const void* a, const void* b)
{
return (*(int*) a - *(int*) b);
}
//解释 qsort(arr,sz, sizeof(int), compare);
//1. arr是数组名,表示首元素的地址
//2. sz表示数组中所有元素的个数,这里sz = 10
//3. sizeof(int)是计算数组中的每个元素是多少字节的
//经计算后是4个字节,或者写成 sizeof(arr[0])
//4. compare表示创建一个函数
//规则就是接收两个无符号指针类型,目的在于排序任何类型的变量
//5. 解释 return (*(int*) a - *(int*) b);
//(1)将其先强制转换成int* 指针,目的是通过指针找到数组中的元素
//(2)再解引用,目的是比较每个元素的大小情况
//(3)最后返回
注:如果我们把a和b调换位置,那么就会进行降序操作
#include
#include
int compare(const void* a, const void* b);
int main(void)
{
int arr[] = { 9,7,8,4,5,6,1,2,3,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr,sz, sizeof(int), compare);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
int compare(const void* a, const void* b)
{
return (*(int*) b - *(int*) a);
}
#include
#include
#include
int compare(const void* a, const void* b);
int main(void)
{
char arr[] = "adgcefb";
int len = strlen(arr);
qsort(arr, len, sizeof(char), compare);
printf("%s\n", arr);
return 0;
}
int compare(const void* a, const void* b)
{
return strcmp((char*)a, (char*)b);
//用strcmp比较字符串
}
//解释 qsort(arr, len, sizeof(char), compare);
//1. arr是数组名,表示首元素的地址
//2. len表示数组中待排序的字符的格式,不包括'\0'
//3. sizeof(char)是计算数组中的每个元素是多少字节的,经计算后是1个字节
//或者写成sizeof(arr[0])
//4. compare表示创建一个函数
//规则就是接收两个无符号指针类型,目的在于排序任何类型的变量
//5. 解释 return strcmp((char*)a, (char*)b);
//(1)将其先强制转换成char*指针,目的是通过指针找到数组中的元素
//(2)再解引用,目的是比较每个元素的大小情况
//(3)最后返回
//这里用到了strlen函数和strcmp函数,不再展开讲
注:如果我们把a和b调换位置,那么仍然会进行降序操作
1. 排序结构体中的字符
(1) 我们先创建一个 struct stu 类型的结构体,里面分别有名字、年龄、成绩 这三个变量
(2) 之后创建一个结构体数组,即用数组装了三个结构体变量
(3) 下面代码,目的是为了把人的名字进行排序,然后展示出来
这就好像我们大一在学校一样,用姓氏来排名
所以我创建了一个 comparebyname 函数进行排序
#include
#include
#include
int comparebyname(const void* a, const void* b);
struct stu
{
char name[20];
int age;
float grade;
};
int main(void)
{
struct stu arr[3] = { {"mingming",23,85}, {"yueyue", 20, 87},{"lili", 26, 90} };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%-15s %-10d %-10f\n", arr[i].name, arr[i].age, arr[i].grade);
}
printf("\n");
qsort(arr, sz, sizeof(struct stu), comparebyname);
for (i = 0; i < sz; i++)
{
printf("%-15s %-10d %-10f\n", arr[i].name, arr[i].age, arr[i].grade);
}
return 0;
}
int comparebyname(const void* a, const void* b)
{
return strcmp(((struct stu*)a)->name, ((struct stu*)b)->name);
}
//解释 qsort(arr, sz, sizeof(struct stu), comparebyname)
//1. arr是数组名,表示首元素的地址
//2. sz表示数组中所有元素的个数,这里sz = 3
//3. sizeof(struct stu)是计算数组中的每个元素是多少字节的,经计算后的值是28个字节
//(结构体内存对齐)
//这里的数组中每个元素是结构体变量,所以就是这么求得的,或者写成sizeof(arr[0])
//4. comparebyname表示创建一个函数,规则就是以字符串的首字符来进行排序整个数组
//5. return strcmp(((struct stu*)a)->name, ((struct stu*)b)->name);
//(1) (struct stu*)a 将无符号指针强制转换成一个结构体指针,目的是通过指针找到数组中的元素
//(2) ((struct stu*)a)->name 访问结构体成员变量
//(3) strcmp()接收的是两个地址,也就是指针类型
//(4) 这其中的name表示的是数组首元素的地址,所以符合strcmp要求
输出结果:
字符升序
l - m - y
同一个想法,不同逻辑
接着,我使用以年龄为排序方式
2. 排序结构体中的整型
同理,我创建了一个 comparebyage 函数
#include
#include
#include
int comparebyage(const void* a, const void* b);
struct stu
{
char name[20];
int age;
float grade;
};
int main(void)
{
struct stu arr[3] = { {"mingming",23,85}, {"yueyue", 20, 87},{"lili", 26, 90} };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%-15s %-10d %-10f\n", arr[i].name, arr[i].age, arr[i].grade);
}
printf("\n");
qsort(arr, sz, sizeof(struct stu), comparebyage);
for (i = 0; i < sz; i++)
{
printf("%-15s %-10d %-10f\n", arr[i].name, arr[i].age, arr[i].grade);
}
return 0;
}
int comparebyage(const void* a, const void* b)
{
return (*(struct stu*)a).age - (*(struct stu*)b).age;
}
//解释 qsort(arr, sz, sizeof(struct stu), comparebyage)
//1. arr是数组名,表示首元素的地址
//2. sz表示数组中所有元素的个数,这里sz = 3
//3. sizeof(struct stu)是计算数组中的每个元素是多少字节的,经计算后的值是 28个字节
//这里的数组中每个元素是结构体变量,所以就是这么求得的,或者写成sizeof(arr[0])
//4. comparebyage表示创建一个函数,规则就是以成绩的大小来进行排序整个数组
//5. return (*(struct stu*)a).age - (*(struct stu*)b).age;
//(1) (struct stu*)a 将无符号指针强制转换成一个结构体指针,目的是通过指针找到数组中的元素
//(2) (*(struct stu*)a).age 访问结构体成员变量
// age 是一个整型变量,所以必须解引用指针,然后访问的才是元素
//(3) 两个整型,在这qsort逻辑里面,直接用减号比较,然后返回就行了
最后,本人是一名程序员小白,如果有大神看到了比较蹩脚、或是错误的代码,希望能指点一二,感谢!