<c语言学习>qsort函数

         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;
    }

        这里假设xy都是指向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;
}

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值