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

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

    推荐阅读
  • 身上长痘痘是怎么回事(身上长痘痘是什么原因)

    身上长痘痘是怎么回事原因一:肺热、经络不通身上会长痘、气候湿热在体滞留形成湿毒,身上也会长痘;原因二:压力过大、经常熬夜、饮食不卫生、吸烟喝酒等不良习惯,会引起分泌失调,进而导致背部长痘。注意个人卫生,个人卫生一定要做好,保持床单与贴身衣物的洁净,要勤洗勤换,洗澡时要先用温水温热身体,用沐浴露或磨砂皂按摩1分钟,再用清水洗净,最后一定要把身上的水分擦干后再穿上衣物。

  • 自制酵母的做法和配方(怎样做自制酵母)

    自制酵母的做法和配方酵母粉、面粉、白糖、玉米粉。先把12克的酵母粉放入大碗中,再放入10克白糖促进发酵,再放入200克四十度左右的温水,搅拌到无颗粒状。晒干后,把自制酵母粉装入食品袋中,用擀面杖把它擀碎,擀碎以后更容易融化。搅匀的酵母粉水少量多次的倒入面粉中,再上手揉成光滑的面团,再包上保鲜膜,摆在温暖的地方,把面团发酵至原来的两倍大。面团发酵好了,里面全是蜂窝状,自制酵母粉的效果非常好。

  • 糖醋鸡蛋为什么有毒(糖醋鸡蛋有毒吗)

    以下内容希望对你有帮助!糖醋鸡蛋为什么有毒糖醋鸡蛋当然没有毒,糖和醋是调料,搭配鸡蛋只是起到了调味的作用,而不会影响鸡蛋是否有毒,通常吃的糖醋煎蛋都是没有任何问题的。糖醋鸡蛋是一道菜品,制作原料有鸡蛋、白砂糖、醋等,是以鸡蛋为主要食材制作而成的一道菜品,属于家常菜,口感酸甜,适合怀孕早期喜食酸味的孕妇食用。

  • cad怎么删除多余的线(cad怎么删除多余的线教程)

    接下来我们就一起去了解一下吧!cad怎么删除多余的线方法一:在CAD中选中需要删除的线。然后点击上方菜单栏中的“删除”即可。如果是多个多余的线条需要去掉一段,可以用到修剪命令,但是需要辅助线,完成以后再把辅助线删除即可。

  • 福建晋江新时代发展(走进县城看发展)

    党的十八大以来,晋江牢记嘱托,以创新为引领,加快智能化、现代化改造升级,将传统产业做大做强。现在,在晋江,已有100多万外来人口留在这儿,他们和本地人一样,在子女就学、参加社保、住房保障等方面享受同等待遇。目前,晋江已逐步形成了鞋服、纺织、食品、建材等产业集群,工业产值亿元以上的企业达1159家,上市公司50家,2021年晋江GDP达2900多亿元。

  • 地暖分水器上阀门拧不动了怎么办(地暖分水器阀拧不动怎么办)

    地暖分水器阀开关不灵活是一件麻烦的事,地暖分水器阀拧不动怎么办,今天就让PChouse来为大家讲解一下。

  • bun是包子吗(bun是包子吗可数名词)

    英文单词“bun”作为名词,是可数名词。其中文含义除“包子”之外,还有“小圆甜蛋糕”“小圆甜饼”“圆面包”“圆发髻”等含义,复数形式为buns。“bun”拟声词,原指头上被敲出的肿块,后词义指代各种圆形小物体。

  • 鱼鳔是什么东西(鱼鳔是啥)

    跟着小编一起来看一看吧!鱼鳔是什么东西鱼鳔是鱼类器官,即俗称的鱼泡。其体积约占身体的5%左右。鱼鳔形状有卵圆形、圆锥形、心脏形、马蹄形等等。鱼鳔里充填的气体主要是氧气、氮气和二氧化碳,氧气的含量最多。帮助调节身体沉浮,在缺氧的环境中,鱼鳔可以作为辅助呼吸器官,为鱼提供氧气。

  • 半角和全角的区别(半角和全角有何不同)

    以下内容大家不妨参考一二希望能帮到您!半角和全角的区别全角是字母和数字等与汉字占等宽位置的字符;半角是ASCII方式的字符,在没有汉字输入法起作用的时候输入的字母数字和字符都是半角。在汉字输入法出现时,输入的字母数字默认为半角,但是标点则是默认为全角,可以通过鼠标点击输入法工具条上的相应按钮来改变。

  • 戴尔optiplex3050台式机(高效稳定之选戴尔商用OptiPlex)

    值得一提的是,戴尔OptiPlex7000系列同样遵循了戴尔的可持续发展理念,主机高达60%的设计均为回收塑料和闭环材料。而基于第12代英特尔酷睿处理器的vPro平台则能为商用PC提供额外的远程管理、安全性方面的保障,由于戴尔OptiPlex7000系列全系标配了英特尔vProEnterprise,因此企业的IT管理人员可以轻松地对其进行远程管理和维护,而且是不用挪地方的那种。

热门推荐

千纸鹤有什么含义 千纸鹤有什么含义吗? 2022阳江阳东区民办初中招生对象 阳江市初中招生计划 陈佩斯评价电影(陈佩斯最被低估的电影) 孩子上课老走神注意力不集中(上课的时候孩子注意力不集中) 苏州领取失业金期间还可以申请医保报销吗 同居关系、事实婚姻关键有多少不同2022 有底蕴有好寓意的男孩子名字(有底蕴有好寓意的男孩子名字有哪些) 清明节适合踏青的游玩(清明气清景明鸟语花香) 厨师节今天餐饮人请向2000万厨师致敬(厨师节今天餐饮人请向2000万厨师致敬) 笔记本电脑键盘上各个按键的功能有哪些?(笔记本电脑键盘上各个按键的功能有多少) 2022重庆璧山区域核酸检测采样点+时间 璧山区医院做核酸检测多久出结果 太阳穴位置处突然凹陷是什么病(邹旭诊室故事头额竖横纹) 学习书法是否一定从楷书学起(楷书是书法的基础吗) 放过自己是什么意思(放过自己的含义) 李嫣窦靖童什么关系(窦靖童是做什么的) 硬盘低级格式化怎么设置(硬盘的高级格式化) 烟雨江湖文皇经怎么突破200级(烟雨江湖文皇经怎么拿) 口组词一年级 口组词一年级上册两个字 怎么选择企业网站建设(企业网站建设与网站开发制作的流程有哪些) 日本幕府时期的特点(被视为天下人的三好家为什么没有成为日本的统一核心)