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

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

    推荐阅读
  • 微信里怎么做促销(5大方法来帮你)

    微信里怎么做促销?微信里怎么做促销采取创新式的营销模式:在邀请朋友添加微信之后,一定要采取不断地创新营销模式,让用户时刻关注自己的动态,然后定期地推广一条产品推广,就达到了一定的效果。宣传有质量的内容:在微信朋友圈,如果人脉积累到一定的程度,一定要多发布一些有质量地内容,也不要全部都是促销的信息,这样的效果也不会达到最佳。

  • 魔兽怀旧服猎人的必备武器(两把151武器的对比)

    魔兽怀旧服猎人的必备武器从魔兽怀旧服P3阶段各职业的表现来看,猎人依旧属于强势职业,并且在T6团本输出环境改善的情况下,延伸出的猛禽舞输出手法让猎人的DPS再度突破上限,但由于玩家间操作手法的不同,关于猎人P3阶段的毕业装备都有所争议,其中最让玩家难以取舍的就是T6团本两个尾王出品的151等级武器。

  • 孩子荨麻疹夜晚止痒妙招(夏季频发荨麻疹)

    荨麻疹是由于人体皮肤及身体黏膜中的小血管扩张及渗透性增加,进而出现的一种局部水肿的反应。针对性的药物治疗:荨麻疹的治疗目的,是要控制儿童瘙痒不适和皮肤风团样皮疹之症状。如氯雷他定联合扑尔敏等治疗。当急性荨麻疹严重发作,伴有神经血管性水肿多处时,此时需要应用静脉的激素和肾上腺素的紧急治疗,避免粘膜水肿加重累及孩子喉部。喉头水肿是危急重症,容易导致窒息甚至死亡。

  • 铁皮石斛养殖方法(铁皮石斛怎么养)

    常见实用的基质主要有松树皮等树皮、水苔、碎石、椰子皮、苔藓、碎木屑等。找一根大的朽木养殖铁皮石斛,这些物质的主要特点就是保水性好,通风性好,不会发生积水。环境铁皮石斛适合生长在阴凉、湿润、空气流通良好的环境中。种植太深水分会长期过多,会导致枯萎死亡的。养护方法铁皮石斛种植完成之后,我们要时刻保持它生长在通风良好的地方,一定要给它遮阴。夏季的时候注意遮阴,尽量不要让其收到强光直射。

  • 养牛哪些基本知识(4点养牛基础知识)

    根据气候条件等因素适时开窗通风,以降低牛舍内的湿度、氨气等。养牛户做好防疫驱虫的情况下,便可以避免绝大多数传染性疫病和寄生虫病的发生。

  • 洗鼻正确手势教程(保姆级教程夏日)

    去黑头“保姆级”教程来了。也可以把水杨酸和下一步的清洁面膜分两天完成。清淡饮食,多吃含维生素A的食物,如胡萝卜、芒果、南瓜、鸡肝等,可促进皮肤新陈代谢,减少黑头产生。手部细菌多,用手挤压容易引起皮肤组织感染、导致毛孔粗大,引发堆积更多的污垢。建议至少每两周换一次床品,对呼吸道、皮肤都有好处。若粉扑使用频率较高,建议一个月左右进行更换。

  • 人群分类指的是什么(人群分类的解释)

    下面希望有你要的答案,我们一起来看看吧!人群分类指的是什么人群分类就是将群体进行划分,社会心理学通常是先对群体的含义进行探讨,然后对各种群体分类作出界定。群体分类的方法有很多种,最常见的方法就是将群体划分为统计群体与实际群体。其中,实际群体又可划分为正式群体和非正式群体、成员群体和参照群体,以及大群体和小群体。

  • 顺德均安天湖社区2022居民基本医保续保通知

    天湖社区2022年度居民基本医疗保险续保工作的通知天湖社区居民:根据社保局的通知,2022年度居民基本医疗续保工作已经开始,现就相关事项通知如下:一、缴费标准:2022年度居民基本医疗保险预计为每人596元,由社保局直接在协议扣费账户中扣取。股份社补贴待代表会议表决通过后再公告。天湖居委会2021年10月20日

  • 胎菊的晾晒方法(胎菊的晾晒方法是什么)

    胎菊的晾晒方法自然晒干:就是直接把采回来的鲜花均匀的摊在干净的水泥地上,让风吹、太阳晒,自然晒干,大约需要7--10天时间才能完全干,是农村最常用的方法。

  • 汽车国家三包什么时候可以换车(新汽车三包1月1日起实行)

    完善退车换车情形新汽车“三包”规定增加了7日内因质量问题免费更换或者退货的情形。将皮卡车纳入“三包”调整范围,污染控制装置也被纳入“三包”条件。减少了免除“三包”责任的情形。删除原规章第三十条第二项规定的“家用汽车产品用于出租或者其他营运目的的”,不再将其作为免除“三包”责任的情形之一。经营者不得限制消费者自主选择维护、保养家用汽车产品的经营者,并将其作为拒绝承担“三包”责任的理由。