0


【排序】什么都能排的C语言qsort排序详解【超详细的宝藏级别教程】深度理解qsort排序

【排序】什么都能排的C语言qsort排序详解【超详细的宝藏级别教程】深度理解qsort排序

作者: @小小Programmer
这是我的主页:@小小Programmer
在食用这篇博客之前,博主在这里介绍一下其它高质量的编程学习栏目:
数据结构专栏:数据结构 这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支持一下吧!
算法专栏:算法 这里可以说是博主的刷题历程,里面总结了一些经典的力扣上的题目,和算法实现的总结,对考试和竞赛都是很有帮助的!

先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力。看完之后别忘记关注我哦!️️️

本篇建议收藏后食用~

**博主之前,也发表过一篇有关排序的博客,里面包含了九大排序的详细剖析,也是干货满满的宝藏噢,需要的伙伴可以通过传送门食用~**【排序】万字九大排序宝藏汇总 轻松拿下九大排序算法【带动画】 (包含超详细的解释和注释)

文章目录

qsort函数的使用方法

qsort的简介:
图片来自www.cplusplus.com
在这里插入图片描述
使用举例:

//1.排序整型#if 1intcmp_int(constvoid* e1,constvoid* e2){return+(*(int*)e1 -*(int*)e2);}void_OutputArr(int* arr,int sz){for(int i =0; i < sz; i++){printf("%d ", arr[i]);}}intmain(){int arr[]={9,8,7,6,5,4,3,2,1,10};int sz =sizeof(arr)/sizeof(arr[0]);qsort(arr, sz,sizeof(arr[0]), cmp_int);_OutputArr(arr, sz);return0;}#endif

**接下来,让我们对着函数简介那张图,和这个使用举例,来剖析

qsort

函数的使用方法:**

函数原型:
在这里插入图片描述
参数分析:

  • 第一个参数:void*base,指待排序的序列(可以是任何类型的数据)的地址
  • 第二个参数:size_t num,指元素个数。
  • 第三个参数:size_t width,指每个元素的大小(单位是字节),因为qsort排序的作者,是不知道我们将要用qsort来排什么类型的数据的,如果是int类型,就是四个字节一个元素,如果是char类型,就是一个字节,如果是结构体类型,可能会更大,所以,我们在使用qsort来对数据进行排序的时候,我们必须告诉qsort,一个元素占几个字节。
  • 第四个参数:int(*cmp)(const void*e1,const void*e2)这是一个函数指针,而cmp这个函数是由使用者自己编写的,用来告诉qsort,什么叫做大,什么叫做小。在这里插入图片描述 由这张图我们可以清晰的知道,如果cmp返回一个小于零的数字,说明e1比e2小 等于0大于0同理。

以上便是qsort函数使用的剖析,接下来,我们举多一个例子,加深一下印象:我们来排序一些结构体数据

struct Stu {char name[20];int age;double score;};intcmp_stu_by_age(constvoid* e1,constvoid* e2){return((struct Stu*)e1)->age -((struct Stu*)e2)->age;}intcmp_stu_by_name(constvoid* e1,constvoid* e2){returnstrcmp(((struct Stu*)e1)->name,((struct Stu*)e2)->name);}intmain(){struct Stu arr[3]={{"zhangsan",20,55.5},{"lisi",30,88},{"wangwu",10,90.0}};int sz =sizeof(arr)/sizeof(arr[0]);//qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_age);qsort(arr, sz,sizeof(arr[0]), cmp_stu_by_name);//这里就不打印了,我们可以调试看到排序的结果 return0;}

看到这里,相信我们已经被qsort这个万能的排序工具深深吸引了。其实,qsort远没有我们想象的那么复杂,接下来,让我们一起模拟实现它!

qsort的模拟实现(冒泡思想)

**

qsort()

在库里面是基于快速排序的思想实现的,但是今天我们学习的重点是实现

qsort

里面的其它细节,而不是排序思想。因此,今天我们使用比较简单的冒泡排序思想来实现这个

qsort

。**

我们来看实现源码:

voidswap(char* bulf1,char* bulf2,int width){//因为我们不知道要交换多少//一次交换一个字节int i =0;for(i =0; i < width; i++){char tmp =*bulf1;*bulf1 =*bulf2;*bulf2 = tmp;
        bulf1++;
        bulf2++;}}voidmy_qsort_ByBubble(void* base, size_t num, size_t width,int(*cmp)(constvoid* e1,constvoid* e2)){int i =0;int j =0;for(i =0; i < num -1; i++){for(j =0; j < num -1- i; j++){//交换if(cmp((char*)base + j * width,(char*)base +(j +1)* width)>0){//交换swap((char*)base + j * width,(char*)base +(j +1)* width, width);//由于我们不知道到底要交换多少字节//所以传width}}}}

注意:
**由于

void*

类型是不能进行解引用的,而作为

qsort

的作者,我们也不知道将来要用来排序的数据是什么类型的,因此,最方便的方式就是将

void*

类型强转位

char*

类型,再乘上

width

,我们就可以得到我们需要的指针类型了。**

尾声

看到这里,相信你对qsort这个库函数已经有了一定认识,如果你感觉这期博客对你有帮助的话,请不要吝啬你们的点赞收藏和关注哦


本文转载自: https://blog.csdn.net/Yu_Cblog/article/details/123518583
版权归原作者 @小小Programmer 所有, 如有侵权,请联系我们删除。

“【排序】什么都能排的C语言qsort排序详解【超详细的宝藏级别教程】深度理解qsort排序”的评论:

还没有评论