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

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

    推荐阅读
  • 文玩圈常见的绿松石是什么(有铁线的绿松石)

    铁线,是绿松石在地质形成中自然生长的伴生矿物质集合体。百匠诀同质量绿松石的素料价格,比有钱线的松石价格高出一节,这是因为货源稀缺,市场上己经很难找到大体积的素料了,不过素料并不一定是王道,很多美丽稀有的铁线松比素料价值要高上很多。

  • 糯米丸子做法(糯米丸子的家常做法是什么)

    糯米丸子做法食材:肉馅500克、糯米300克、枸杞10克、葱15克、姜15克、香菜10克、鸡蛋1个、盐15克、料酒20克、味精5克、鸡粉10克、胡椒粉5克、淀粉50克、香油10克。将葱洗净,其中5克切片,10克切沫。放入葱姜水,放香油、鸡蛋打匀后,放入到肉馅,加淀粉抓匀。将肉馅放入泡好的糯米上,取一只盘子,放在上面。加少许清水和鸡粉、淀粉,将水淀粉勾芡,枸杞、香菜点缀即可。

  • 土豆炖鸡怎么做(制作土豆炖鸡的方法)

    下面内容希望能帮助到你,我们来一起看看吧!土豆炖鸡怎么做鸡肉、土豆、盐、料酒、生抽、葱、油、干辣椒、啤酒、姜。鸡肉切块,用盐,料酒,生抽,葱拌匀腌制15分钟。土豆去皮切2cm见方的小块。锅内烧热油,放葱姜下鸡块翻炒至鸡块变色,水份大部分消失,下生抽和土豆块翻炒2分钟。加水与材料齐平,放盐,大火烧开,小火慢炖20分钟,转中火加几个干辣椒收干汤汁即可。

  • 柴油车尾气不达标怎么办(用以下方法简单判断和修复)

    柴油车尾气不达标怎么办常规检查部分:汽缸磨损度、喷油嘴偶件卡滞、供油时间变化、气门间隙、空气滤清器。对照检查部分出现的问题及时调整与修复,经修复后的柴油车,其性能指标理应达到规定的技术要求,包括应达到规定的动力性、经济性及排放烟度指标。应该考虑汽缸的喷油量是否够,可能是积碳造成喷油嘴部分堵塞或调整不当。轮边功率合格、排放超标3倍以上进气量不够燃烧恶化,喷油嘴或汽缸中度磨损或积碳。适当调整喷油泵。

  • 东北酸菜炖排骨的做法 东北的酸菜炖排骨的做法

    3、开始制作,锅内下入荤油,油热爆香葱姜然后下入酸菜炒出酸香味儿。

  • 人死了三魂七魄从哪里离开身体(头七回魂夜家人为何避退三舍)

    人死了三魂七魄从哪里离开身体人死后,头七回魂夜家人为何避退三舍?亲身经历告诉你前几天回老家,看到了邻居嬢嬢,一场脑堵塞让她半身不遂,每天拄着拐杖努力的练习走路,就不经意的想起了她的婆婆。接着就传来噼里啪啦的鞭炮声和哭声。办丧事那些咱们先且不表,直接跳到头七那天。在前几天嬢嬢就跟我和外婆商量了头七晚上在我家睡,整个院子就只有我们3人在家,而且那个时候的我经常看林正英的片子,所以我也心生畏惧。

  • 寻龙分金看桃山(寻龙分金看缠山)

    果然此地有座明代的王陵,而且地宫规模之大,已超皇陵。古墓位于河南省禹州市无梁镇具茨山,导航周定王墓即到。他编著有《救荒本草》等医学作品,对我国医药事业的发展做出了巨大贡献。周定王墓由墓道、墓门、甬道和前、后、左、右、中五组砖石拱券墓室组成。盗墓贼水平很高,盗洞直接穿山而下,笔直的打在棺椁正上方。或因周定王墓无数次被盗,里边究竟有什么随葬品,就成了永远的谜。夜晚具茨山上的月晕,漫如潮涌。

  • 文物古宅能不能申请修理(农房翻建挖到文物)

    虽然古墓疑似被盗,但经专家对墓志铭等鉴定,该古墓为南宋时期古墓。目前,文物已运到泸县博物馆。根据《文物保护法》的规定:盗窃、哄抢、私分或者非法侵占国有文物,构成犯罪的,要依法追究刑事责任;发现文物隐匿不报或者拒不上交,尚不构成犯罪的,由县级以上人民政府文物主管部门会同公安机关追缴文物,情节严重的,处五千元以上五万元以下的罚款。

  • 减肥面部脂肪会流失(如何无需花费大量现金减掉面部脂肪)

    例如,做弓步来燃烧大腿周围的脂肪,或者做腹部运动来融化腹部脂肪。而且它在技术上也不会“燃烧”。换句话说,如果你的使命是减掉面部脂肪并达到减肥目标,那么最好的办法是减少整体体脂,因为局部减脂实际上并不起作用。虽然体重增加的原因因人而异,但饮食不良、缺乏运动和基因构成通常是罪魁祸首。然而,过量饮酒可能是体重增加和腹胀的最大罪魁祸首之一。

  • 山楂干炖羊排如何做(山楂干炖羊排的烹饪方法)

    下面希望有你要的答案,我们一起来看看吧!山楂干炖羊排如何做材料:羊排、山楂干、糖、盐、黄酒、醋、淀粉、葱姜末。山楂干切小块,锅中放少许水煮熟成酱。羊排洗净加黄酒、盐腌,放淀粉拌匀。锅内放油,羊排煎熟捞出。锅中放少许油,煸香葱姜加羊排、黄酒、山楂酱、盐,炒匀后淋水淀粉勾芡淋醋出锅。