肥宅钓鱼网
当前位置: 首页 钓鱼百科

c语言任意排序法(CC快速排序)

时间:2023-08-01 作者: 小编 阅读量: 1 栏目名: 钓鱼百科

看名字都知道快速排序是目前公认的一种比较好的排序算法。因为它速度很快,所以系统也在库里实现这个算法,便于我们的使用。这个函数用来比较两个数组元素,第一个参数大于,等于,小于第二个参数时,分别显示正值,零,负值。qsort要求提供一个自己定义的比较函数。比较函数使得qsort通用性更好,有了比较函数qsort可以实现对数组、字符串、结构体等结构进行升序或降序排序。

c语言任意排序法?文章目录1有关qsort2,具体形式3、实例说明4、C中sort用法以及和c中qsort的区别,我来为大家科普一下关于c语言任意排序法?以下内容希望对你有帮助!

c语言任意排序法

文章目录1有关qsort2,具体形式3、实例说明4、C中sort用法以及和c中qsort的区别

1有关qsort

排序方法有很多种:选择排序,冒泡排序,归并排序,快速排序等。 看名字都知道快速排序是目前公认的一种比较好的排序算法。因为它速度很快,所以系统也在库里实现这个算法,便于我们的使用。 这就是qsort函数(全称quicksort)。它是ANSI C标准中提供的,其声明在stdlib.h文件中,是根据二分法写的,其时间复杂度为n*log(n)

qsort函数声明如下:

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

参数说明:

1 .base,要排序的数组

2、nmemb,数组中元素的数目

3、size,每个数组元素占用的内存空间,可使用sizeof函数获得

4、compar,指向函数的指针也即函数指针。这个函数用来比较两个数组元素,第一个参数大于,等于,小于第二个参数时,分别显示正值,零,负值。

qsort要求提供一个自己定义的比较函数。比较函数使得qsort通用性更好,有了比较函数qsort可以实现对数组、字符串、结构体等结构进行升序或降序排序。

如比较函数 int cmp(const void *a, const void *b) 中有两个元素作为参数(参数的格式不能变),返回一个int值,比较函数cmp的作用就是给qsort指明元素的大小是怎么比较的。

2,具体形式

一,对int型数组排序

int num[100];

int cmp_int(const void* _a , const void* _b)//参数格式固定

{

int* a = (int*)_a; //强制类型转换

int* b = (int*)_b;

return *a - *b;

}

qsort(num,100,sizeof(num[0]),cmp_int);

12345678910

二,对字符型数组排序

char word[100];

int cmp_char(const void* _a , const void* _b)//参数格式固定

{

char* a = (char*)_a; //强制类型转换

char* b = (char*)_b;

return *a - *b;

}

qsort(word,100,sizeof(word[0]),cmp_cha

12345678910

三,对double型数组排序

double in[100];

int cmp_double(const void* _a , const void* _b)//参数格式固定

{

double* a = (double*)_a; //强制类型转换

double* b = (double*)_b;

return *a > *b ? 1 : -1;//特别注意

}

qsort(in,100,sizeof(in[0]),cmp_doub

12345678910

在对浮点或者double型的一定要用三目运算符,因为要是使用像整型那样相减的话,如果是两个很接近的数则可能返回一个很小的小数(大于-1,小于1),而cmp的返回值是int型,因此会将这个小数返回0,系统认为是相等,失去了本来存在的大小关系

四、对字符串数组排序

char word[100][10];

int cmp_string(const void* _a , const void* _b)//参数格式固定

{

char* a = (char*)_a;//强制类型转换

char* b = (char*)_b;

return strcmp(a,b);

}

qsort(word,100,sizeof(word[0]),cmp_string);

3、实例说明

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

#include<string.h>

void main(void)

{

int i;

int a[10]={0,1,2,3,4,5,6,7,8,9};

char b[10]={'a','b','c','d','e','f','g','h','i','j'};

double c[10]={0.1,0.2,0.9,0.5,0.3,0.6,0.7,0.8,1.1,1.2};

int cmp1(const void * a,const void * b)

{

return (*(int*)a-*(int*)b);//a>b 返回正值

}

int cmp2(const void * a,const void *b)

{

return(*(char*)a-*(char*)b);

}

int cmp3(const void * a,const void * b)

{

if(fabs(*(double*)a-*(double *)b)<1*exp(-20))

return 0;

else

return(((*(double*)a-*(double*)b)>0)?1:-1);

}

qsort(a,10,sizeof(int),&cmp1);//对于函数指针(指向函数的指针),直接传入函数名或&函数名进行

//运算都是可以的,因为在调用函数时也是取的函数的地址

qsort(b,10,sizeof(char),cmp2);

qsort(c,10,sizeof(double),cmp3);

for(i=0;i<10;i)

printf("%d ",a[i]);

for(i=0;i<10;i)

printf("%c ",b[i]);

for(i=0;i<10;i)

printf("%lf ",c[i]);

}

4、C中sort用法以及和c中qsort的区别

1、整形数据比较

bool cmp(int a,int b){

return a < b;

}

int a[10];

sort(a,a 10,cmp);

12345

2.实型数据比较

bool cmp(float a,float b){

return a < b;

}

int a[10];

sort(a,a 10,cmp);

12345

3,结构体类型比较

题目:有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息。

struct student

{

int grade;

char name[101];

int age;

}stu[1001];

bool cmp(student a,student b)

{

int t = strcmp(a.name,b.name);

if(a.grade != b.grade)

return a.grade < b.grade;

else if(t != 0)

return t < 0;

else

return a.age < b.age;

}

sort(stu,stu n,cmp);

1234567891011121314151617181920

关于cmp函数参数中的&符号(转) 关于sort函数中的cmp函数有着不同的写法,以刚刚的整形元素比较为例

还有人是这么写的:

bool cmp(const int &a, const int &b){

return a>b;

}

int a[10];

sort(a,a 10,cmp);

思考:int 和const int&有什么区别呢?

原来:作为函数参数:int这种写法是值传递,const int&则是引用传递。 “值传递”——由于函数将自动产生临时变量用于复制该参数,效率较低。 “引用传递”仅借用一下参数的别名而已,不需要产生临时对象。效率较高。 tips:“引用传递”有可能改变参数,const修饰可以解决这个问题。

想学习更多C/C编程知识,可以加入C/C学习交流群:587250700

    推荐阅读
  • 十万个为什么科普故事(承包了你童年科普生活的十万个为什么)

    没想到哇,第一本《十万个为什么》已经90岁了!在新中国成立后,上海少年儿童出版社借用了这本书名,开始编辑出版属于我国自己的《十万个为什么》。第一版《十万个为什么》一共八册,有1484个“为什么”。第二版《十万个为什么》在1964年出版,共有14册,回答了2003个“为什么”。第六版《十万个为什么》是目前最新的版本,2013年出版,整个系列有18册,4500个“为什么”。《十万个为什么》系列可以说是80、90后的童年代表符号之一了。

  • 桐庐生仙里国际滑雪场不自驾怎么去(桐庐高铁站到生仙里滑雪场)

    杭州桐庐生仙里国际滑雪场不自驾怎么去交通指南:1、通过杭州各大旅行社报名,直接购买滑雪门票+交通套餐,很方便!经过电话咨询景区人员,平日价格大概在208元左右,周末在288元左右2、自行导航路线自驾前往咨询热线:0571-569885981、根据疫情防控相关规定,严格落实“预约、限量、错峰”总体要求,桐庐生仙里国际滑雪场将实行网上购票。桐庐生仙里国际滑雪场预计将在11月25号开板试滑。

  • 纠纷调解经验分析(纠纷调解的方法与技巧有哪些)

    否则无法调解,甚至愈演愈烈,发生更严重后果。调解机构没有作出判决、裁定、决定的权力。能在调解过程中起到事半功倍的效果,对于调解不成功的情形,当事人可以在书写诉状后向人民法院提出起诉请求。人民法院在受理后,由于需要在限定期限内结案,故而其会及时安排开庭,按照流程,在开庭前,还会再安排一次调解。

  • 什么是人才什么是庸才(强国必善于用人才)

    作为有远大思想的李斯,只所以投靠秦国,是仰慕秦王的雄才大略和强大开疆扩土雄霸华夏壮志的君王。以李斯在秦期间对秦王的接触和了解,以及建立起来的信任关系,从他呈《论统一书》后秦王的态度,足可以看出秦王是一位具有政治头脑和战略眼光的君主。李斯认为,有了四位君王注重罗致客卿人才,使秦国逐渐走向强大的关键。

  • 有高端新款女装吗(这些女装今年还会火吗)

    这些女装今年还会火吗Winshang引言年度购物中心关注女装品牌Top50来源|商业地产云智库(ID:sydcxy2014)//年度购物中心关注女装品牌榜TOP50//数据采集时间:2018年1月-12月年度购物中心关注。

  • 龙头香在什么地方(龙头香的位置)

    龙头香在什么地方龙头香在武当山南岩“天乙真庆万寿宫石殿”外绝崖旁的一座雕龙石梁。石梁悬空伸出2.9米,宽约30厘米,上雕盘龙,龙头顶端,雕一香炉,因此号称“天下第一香——龙头香”。龙头香对面为礼斗台和风月双清亭遗址。龙头香四面崛起一峰,悬岩万仞,直刺中天,大有欲飞之势,自然景色绝佳,其上建有梳妆台和飞升台。相传真武大帝居住武当修炼42年,得道升天,曾在此梳妆更衣,故亦名“更衣台”。

  • 揉团的意思(揉团出自哪)

    我们一起去了解并探讨一下这个问题吧!揉团的意思揉团,用手反复推压搓弄东西,使之成球形。出自:人教版七年级上册语文28课《女娲造人》:想着,她就顺手从池边掘起一团黄泥,掺和了水,在手里揉团着,揉团着,揉团成了第一个娃娃模样的小东西。据说女娲造人是用泥掺和了水,在手里揉团着娃娃样就可以了。

  • 设置别人打我电话关机(设置别人打我电话关机怎么取消)

    设置别人打我电话关机的方法是:1、首先打开手机桌面找到电话选项并打开,打开之后点击电话功能图标;2、打开后选择电话设置进入到手机电话设置页面,接着在电话设置页面打开骚扰拦截选项,打开后点击来电拦截。

  • 社会学专业就业方向(就业方向介绍)

    目前咨询公司很多。社会学专业完全可以胜任其中的公关策划、公共形象设计、文秘等工作。各种公司的人事或人力资源部职员,一些人力公司和猎头公司职员。包括报纸、杂志、电台、电视台、网站等均可。从事社会工作方面的工作。在工、青、妇等各种社会团体、各类科技园区、社会社区中从事各类社会工作的管理、咨询与服务工作。应聘或报考公务员。应聘中外NPO、NGO组织。

  • 重庆马房湾七彩巷怎么去? 马家湾七彩巷怎么走

    马房湾七彩巷这个奇幻之地。整个山坡都是色彩斑斓的,和美国加州的“救赎山”有点像。周边的房子也被刷成了彩色,走进这里,仿佛就像走进了童话世界一般。周围主要是主城的老巷子,环境比较落后,但色彩丰富,出片率比较高,建议穿纯色衣服前去哟~一、门票:免费二、开放时间:全天三、地点:马房湾七彩巷四、交通指南:乘坐轨道交通1号线杨公桥站1B出口,再往前走200米就到了