库函数中有个函数叫快速排序函数的东西
它能对结构体排序、整形、字符等类型进行排序
在Cplusplus中讲述的是:
void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));
这是这个函数的格式
接下来是参数解释:
void* base : 从哪开始,一般指的是数组名。
size_t num : 指的是元素个数。
size_t size : 指的是单个元素的类型(字节)。
int (*compar)(const void*,const void*) : 函数指针,数组中两个元素交换的类型
函数指针判断的是这两个元素相减是 >0 or =0 or <0
是根据这个排序
它的一般格式是:
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
int* 对应的是数组元素类型为int
如果是char,那么就要将e1和e2强制类型转换为char*,再将它们的差值返回。
调用函数
qsort(arr, sz, sizeof(arr[0]), cmp_int);
完整代码
#include <stdio.h>
#include <stdlib.h>
int print(int* arr, int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d ", *(arr + i));
}
printf("\n");
}
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
int main()
{
int arr[10] = { 89,65,32,45,78,12,30,26,85,74 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_int);
print(arr, sz);
}
补充1 : 对结构体的排序
设定一个结构体为
struct stu
{
char name[20];
int age;
};
int main()
{
struct stu s[3] = { {"zhangsan",40},{"lisi",28},{"wangwu",21}};
}
结构体排序需要指明是对结构体中的那个元素排序,
故它的函数指针应该填:
年龄
int sort_by_age(const void* e1,const void* e2)
{
return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
//注意 结构体指针 ->(指向) 结构体成员
}
名字
int sort_by_name(const void* e1, const void* e2)
{
return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
注意 strcmp 是专门对付字符串比较的,记得引头文件<string.h>
比较的是字符串首字母的ASCII码值
整体代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stu //定义结构体
{
char name[20];
int age;
};
int print(int* arr, int sz) //数组打印函数
{
for (int i = 0; i < sz; i++)
{
printf("%d ", *(arr + i));
}
printf("\n");
}
int sort_by_age(const void* e1,const void* e2) //按年龄比较的函数指针
{
return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
}
int sort_by_name(const void* e1, const void* e2)//按名字比较的函数指针
{
return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
//strcmp 如果两个字符串相等返回0 如果字符串1大于字符串2 则返回1,否则返回-1
}
int main()
{
struct stu s[3] = { {"zhangsan",40},{"lisi",28},{"wangwu",21}};
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), sort_by_name);
printf("%s %s %s", s[0].name, s[1].name, s[2].name);
}
补充2:升序降序
qsort可以实现升序和降序,方法就是指针函数上
举例就用整形排序来说
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
若使用 *(int*)e1 - *(int*)e2
那么就会进行qsort特定的排序
实现小的数在前面,大的数在后面
实现升序;
若用 *(int*)e2 - *(int*)e1
那么qsort特定的排序
就会把大的数放前面,小的数放后边
实现降序;
例:
升序
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
降序
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e2 - *(int*)e1;
}
结构体雷同。
本人语言水平不行,若有说错的地方,敬请指出!!多谢!!