c语言的qsort快速排序函数

目录

qsort的介绍

测试

排序int类型

排序char类型

排序结构体类型


qsort的介绍

        c语言中有很多排序,比如常见的选择排序,冒泡排序,插入排序,但是c语言的库函数中,有一个qsort()函数,可以实现快速排序,性能更好,下面就是对qsort的介绍。

头文件:<stdlib.h>

函数原型:

void qsort (   void* base,
                     size_t nmemb,
                     size_t size,
                     int (*compar)(const void* e1, const void* e2)
                );

base是指:  待排序数据的起始位置

memb是指:待排序的数据的元素个数

size是指:    待排序的数据的元素大小(单位是字节)

最后一个参数:比较2个元素大小的函数指针(需要自己写)

        对于最后一个参数(下文称作“自编函数”),在cplusplus里面找到如下的资料:

        不难看出, int (*compar)(const void* e1, const void* e2)的返回值有3种,分别是>0,<0和=0。返回值>0时,把e1排到e2后面;返回值<0时,把e1排到e2前面;返回值=0时,不改变顺序。

测试

排序int类型

如下,测试qsort对于int类型数据的排序:

        cmp_by_int完全按照上述要求来写,返回值是int类型,并且只有>0,<0和=0三种可能,两个const void* 类型的参数。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int cmp_by_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}

int main()
{
	int a[10] = { 3,5,22,456,74,39,6,66,89,1 };
	int sz1 = sizeof(a) / sizeof(a[0]);
	qsort(a,sz1,sizeof(a[0]),cmp_by_int);
	return 0;
}

通过调试,监视a,得到运行后的结果,不难看出,a数组里面的数据已经按从小到大的顺序排好:

 另:如果把cmp_by_int里面,改成return *(int*)e2 - *(int*)e1; 那么将会得到从大到小排序的数据。

        对于double类型和float类型,和int类型类似,这里也不过多测试,只需要在自编函数里面e1和e2强制类型转换成double类型或者float类型即可。

排序char类型

        对于strcmp()函数,由于其返回值就是-1,0和1,符合要求,所以直接return就行。需要注意的是,strcmp()里面,两个参数是填写的地址,所以强制类型转换之后,不需要再进行解引用操作。

        这里sz4=sizeof(d)/10;d[4][10]是开辟了一个二维数组,看成四个一维数组成,每个一维数组是10个字节的大小, sizeof(d)求出的是整个数组的大小,无疑是4*10=40(字节),但是要排序操作的实际上是4个字符串,所以用整个数组大小整除每个字符串所占空间(无论字符串有没有占满10个字节,都是10,因为开辟空间就是开辟的10个)。(当然在这里直接写4也可以)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int cmp_by_char(const void* e1, const void* e2)
{
	return strcmp((char*)e1, (char*)e2);//strcmp()里面是填写地址
}

int main()
{
	char d[4][10] = { "hello","zhangsan","lisiw","using" };
	int sz4 = sizeof(d) / 10;
	qsort(d, sz4, 10,cmp_by_char);
	return 0;
}

排完序的结果如下:

排序结构体类型

代码如下:

        按照结构体里面的age从小到大排序。由于排序的是结构体,所以自编函数传参后要强制类型转换成结构体类型,然后再到结构体类型里面的数据。同时,这个时候排序是对一个个结构体类型进行排序,所以qsort的第三个参数(每个元素的空间大小)是一个该结构体类型所占的空间大小。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct student
{
	char  name[20];
	int age;
}stu;

int cmp_by_struct_int(const void* e1, const void* e2)
{
	return ((stu*)e1)->age - ((stu*)e2)->age;
}

int main()
{
	stu arr[4] = { {"zhangsan",90},{"lisi",18},{"wangwu",66},{"wulie",20}};
	int sz5 = sizeof(arr) / sizeof(arr[0]);
	qsort(arr,sz5,sizeof(arr[0]),cmp_by_struct_int);
	return 0;
}

排序后的结果如下:

对于结构体里面char类型数据排序如下:

        由于结构体里面name本身就是地址,所以strcmp()里面的参数,只需要如下取值就行。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct student
{
	char  name[20];
	int age;
}stu;

int cmp_by_struct_char(const void* e1, const void* e2)
{
	return strcmp(((stu*)e1)->name,((stu*)e2)->name);
}

int main()
{
	stu arr1[4] = { {"zhangsan",90},{"lisi",18},{"wangwu",66},{"wulie",20} };
	int sz6 = sizeof(arr1) / sizeof(arr1[0]);
	qsort(arr1, sz6, sizeof(arr1[0]), cmp_by_struct_char);

	return 0;
}

按名字排序后的结果:

以上就是个人对目前qsort()函数的理解,有什么错误欢迎再评论区指正哦!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力努力再努力.xx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值