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

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

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

看名字都知道快速排序是目前公认的一种比较好的排序算法。因为它速度很快,所以系统也在库里实现这个算法,便于我们的使用。这个函数用来比较两个数组元素,第一个参数大于,等于,小于第二个参数时,分别显示正值,零,负值。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

    推荐阅读
  • 怀孕十周吃什么食物营养 怀孕十周多吃什么好

    加强钙的补充怀孕十周时要注意加强钙的补充,每天钙的补充量在800毫克左右,吃虾皮、鸡蛋、豆腐、菠菜等含钙的食物,多喝牛奶,它可以使尿液中钠排泄增多,降低血容量以消除水肿,还可以防治妊娠高血压,并有益于胎儿骨骼的发育。怀孕十周饮食禁忌不吃易流产食物常见的易导致流产的食物有,螃蟹、甲鱼、槟榔、田螺、蚌肉。它们活血通淤、收缩子宫,食用后对早期妊娠有造成出血、流产之弊。

  • 财务章是什么(什么叫财务章)

    以下内容希望对你有帮助!财务章是什么财务章,即财务专用章,是各单位办理单位会计核算和银行结算业务时使用的专用章,会计中心为各单位统一刻制了冠有单位名称和“会计中心(序号)”字样的财务专用章,并经单位领导授权后使用。单位原有的财务专用章限用于内部财务管理,但不得用于银行结算。省财政厅为此还专门行文予以规范。

  • 山楂和桑葚能一起泡水喝吗(有关山楂和桑葚一起喝好吗)

    下面希望有你要的答案,我们一起来看看吧!山楂和桑葚一起泡水喝,有消食化积的作用,同时提高食欲、促进胃肠蠕动、有润肠通便的作用,对胃肠道还有一定的养护作用。山楂和桑葚一起泡水喝,能够滋阴补血、特别适合一些贫血的患者饮用,同时能够提升人体免疫力,还能美容养颜。

  • 情人节给女朋友说的话(情人节唯美情话句子)

    情人节给女朋友说的话?任时光流转,你在我心中依然最美;凭世事变迁,你我依然始终把爱情守候;纵年华易逝,我们的爱情每一天都是新鲜七夕情人节到了,我愿陪着你一直到老,现在小编就来说说关于情人节给女朋友说的话?七夕情人节到了,我愿陪着你一直到老。永不褪色的是对你默默的关怀,永不停息的是对你无尽的思念,永不改变的是对你深深的爱恋,七夕情人节快乐!爱原来就在身边,我的世界因为有你而精彩。

  • lawofnature自然法则(自然万物之一WGSN)

    “天人合一”的人文情怀在时尚圈,ICICLE之禾作为一个极有远见、注重品质且低调的中国品牌有着颇高的口碑。ICICLE之禾由叶寿增和陶晓马夫妇创立于1997年,前者曾在东华大学教书。直到2018年,ICICLE才自觉准备好开始与公众媒体建立对话,阐明自己的理念。在ICICLE之禾总裁陶晓马女士看来,品牌需要以更主动的姿态与消费者建立联系,进行发声。除了关注环境问题,ICICLE还非常重视文化传承。对于ICICLE的人来说,设计不是用来炒作的,而是用来完善产品的。

  • 如何做田园鲜蔬汤(做田园鲜蔬汤的方法)

    将腔骨剁成块洗净玉米,胡萝卜,青笋和荸荠都去皮洗净后切块姜洗净切片,现在小编就来说说关于如何做田园鲜蔬汤?下面内容希望能帮助到你,我们来一起看看吧!锅中倒入清水,大火加热至沸腾后,放入腔骨焯烫3分钟,捞出用清水冲去表面的浮沫。放入姜片,盖上盖子调中小火煲1小时。先放入玉米块,荸荠和胡萝卜块,盖上盖子继续用小火煲1个小时,然后再放入青笋煲5分钟,食用前调入盐即可。

  • 化学学习方法是什么(化学学习的方法)

    接下来我们就一起去了解一下吧!化学学习方法是什么首先,化学虽然属于理科,但它却有文科的特点:基本内容很多、杂而乱,背诵记忆的知识点很多。某位高考状元说过学化学就是背书。只有把书本上的诸多知识点背熟,才有能力进行分门别类的归纳综合。“化学是一门记忆学科”大凡化学学得好的同学主要是掌握了化学的记忆方法,轻松愉快而又高效的记住了化学众多的知识点。学习化学要认真做必要的练习题,若要学好化学,习题必不可少。

  • 秦皇陵博物院官网直播(秦陵博物院今起恢复开放)

    秦皇陵博物院官网直播根据最新疫情防控工作安排,秦始皇帝陵博物院在做好疫情常态化防控的同时,于8月28日起恢复开放。落实实名制售检票,观众参观须持个人有效身份证件。根据疫情防控要求,秦始皇帝陵博物院单日最大观众接待量不超过景区最大承载量的50%,达到限量后将停止售票,各展厅将根据实时观众量实行流控措施。对所有参观人员,查验72小时内核酸检测阴性证明。

  • 猪血能放冰箱保存多久(猪血能放冰箱保存2天对吗)

    以下内容希望对你有帮助!猪血能放冰箱保存多久猪血能放冰箱保存2天。猪血放到冰箱内冷藏超过两天,就会发粘、变色、有异味。且猪血只能冷藏,不能冷冻,冷冻后再化开时就散了。因为冰箱冷藏室的低温,只能抑制细菌生长繁殖速度而不是杀灭细菌,贮存时间以2天为宜,过长贮存细菌可缓慢繁殖而增多,从而引起食品腐败变质。冰箱不能完全防止食品腐败。

  • 李诞与黑尾酱离婚的原因(李诞女友黑尾酱颜值超高)

    自从李诞上了《向往的生活》,他的女朋友黑尾酱也彻底火了。人们都说李诞简直是人生赢家,不仅才华洋溢,女朋友也好看得逆天,就像小精灵一样,既有森女的慵懒气质,又带着一点叛逆的酷。两个人感情超级甜蜜,经常在微博上秀恩爱。有人说,李诞和黑尾酱就是一个有趣的灵魂和一个好看的皮囊。关于黑尾酱,有网友爆料是解放军艺术学院的,和美美的夏夏是同学。但是两人是怎么认识的就不得而知了。