qsort函数是什么
在C语言中,qsort()
函数是一个内置的标准库函数,用于对指定数组进行排序。包含于以下库中:
#include <stdlib.h>
该函数实现了快速排序算法(Quick Sort),能够对任意类型的数据进行排序。
qsort()
函数的原型如下:
void qsort(void *base, size_t num, size_t width,
int (*compare)(const void *, const void *));
base
: 指向待排序数组的第一个元素的指针。num
: 数组中待排序的元素个数。width
: 数组中每个元素所占用的字节数。compare
: 一个指向比较函数的指针,这个函数用于决定数组中两个元素的相对顺序。它接受两个指向数组元素的指针作为参数,并返回一个整数值:- 如果返回值小于0,则认为第一个元素应该排在第二个元素之前;
- 如果返回值等于0,则两个元素相等,顺序可以不变;
- 如果返回值大于0,则认为第一个元素应该排在第二个元素之后。
- conpare函数举例:接受俩个要比较大小的元素(整形元素)的地址,返回代表比较结果的整形:
-
int compare (const void* x ,const void* y) { return *(int*)x - *(int*)y; }
这里假设x
和y
都是指向int
类型的指针,在调用qsort
函数时,width
参数应设置为sizeof(int)
,表示每个元素的大小为一个整型。
这个比较函数首先将void
指针类型安全地转换为int
指针类型(可看做强制类型转化),然后解引用得到对应的整数值进行减法操作。如果*(int*)x
小于*(int*)y
,则返回负数,表明x
应该排在y
之前;如果两者相等,则返回0;如果*(int*)x
大于*(int*)y
,则返回正数,表明x
应该排在y
之后。
如果要对其他类型的数据进行排序,需要相应地修改这个比较函数以适应不同类型的数据,并且保持正确的比较逻辑。
为了遵循良好的编程实践和避免未定义行为,应当使用const void*
而不是void*
作为比较函数的参数类型。(加上const表示指向内容不可被修改)
由于qsort()
函数处理的是通用类型的指针,所以它可以用来排序整型、浮点型、字符型以及自定义结构体等多种数据类型,非常灵活和通用。
qsort函数使用
简单的整形数组排序:
#include <stdlib.h>
#include<stdio.h>
int compare(const void* x, const void* y)
{
return *(int*)x - *(int*)y;
}
int main()
{
int arr[10] = { 1,0,2,9,3,8,4,7,5,6 };
int* base = &arr[0]; //首元素地址
int num = sizeof(arr) / sizeof(arr[0]);//元素数量
int width = sizeof(arr[0]); //单个元素的大小
int (*compare_1)(int*,int*) = compare;//取函数地址存入函数指针 &可省略
qsort(base,num,width,compare_1);
for (int i = 0; i < num; i++)
{
printf("%d ",arr[i]);
}
return 0;
}
结构体排序
(试例为简单的学生结构体,包含名字和年龄,按年龄排序)
#include <stdlib.h>
#include<stdio.h>
struct stu
{
char name[20];
int age;
};
int compare(const void* x, const void* y)
{
return ((struct stu*)x)->age - ((struct stu*)y)->age;
}
int main()
{
struct stu arr[3] = { {"zhangsan",20} ,{"lisi",19} ,{"wangwu",21}};
struct stu* base = &arr[0]; //首元素地址
int num = sizeof(arr) / sizeof(arr[0]);//元素数量
int width = sizeof(arr[0]); //单个元素的大小
qsort(base, num, width, compare);//函数名本身可以作为地址用
for (int i = 0; i < num; i++)
{
printf("%d ", arr[i].age);
}
return 0;
}