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

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

    推荐阅读
  • 关于鸡的俗语鸡扒命(鸡扒命是什么意思)

    3、鸡扒命,指人奔波忙碌,如同鸡东扒西啄一样,到头来只能聊得温饱而已,不可能鸡肋,比喻做无多大意义而又不忍舍弃的事情;抑可比喻瘦弱的身体。

  • 西红柿和李子能同时吃吗(西红柿和李子能否一起吃)

    以下内容大家不妨参考一二希望能帮到您!西红柿富含蛋白质、脂肪、碳水化合物、维生素A、胡萝卜素、维生素B、维生素C、维生素E、膳食纤维、叶酸、核黄素、烟酸、硫胺素、番茄红素以及微量元素。从两者的营养成分来看,并不冲突,是可以一起吃的。

  • 可怜的怜怎么组词(可怜的怜怎么组词儿?)

    看着自己的影子,自己怜惜自己。原形容孤独失意的情状。现多形容自我欣赏。比喻男子对女子十分爱怜温存。也作“惜玉怜香”。

  • 阳台种什么水果

    无花果营养价值非常高,结果期长,养护简单,适合在家庭养殖无花果根系比较发达,最好用大一号的花盆来养护放在阳台上,要经常开开窗通通风,多晒太阳每月给它用上1~2次的有机肥或复合肥盆土干透浇透,无花果一样可以果实累累,今天小编就来聊一聊关于阳台种什么水果?盆土干透浇透,无花果一样可以果实累累。每隔一两个月浇一次硫酸亚铁,来维持土壤的酸碱度。结的果实不仅多,而且个头还大。

  • 试述公共组织的作用(关于公共组织的作用)

    政府是人民生命财产的保护者,是社会秩序的维护者。政府为公众提供的另一种公共物品是保护人民的生命与财产的安全和维护社会秩序。政府执行有关法律,制定公共政策,打击那些以各种手段非法威胁或剥夺人的生命和私有财产的不法行为,使最基本的人权得到保障。政府是国家主权和领土完整的捍卫者。为社会提供公平是政府的重要责任。

  • 领证吉日是怎么挑选的(结婚领证日子该怎么选)

    下面小编交给大家选择结婚领证好日子的方法!结婚领证需要选好日子吗结婚领证说起来也算是一件很值得开心的喜事,所以还是值得多花一些时间来选择登记的日期,如果是有一些浪漫情怀的新人,就会选择特别有意义的日子登记结婚,小编认为还是应该选择一个好日子来结婚。

  • 普拉多霸道4000有手动挡吗?(进口普拉多4000手动挡)

    普拉多霸道4000是有手动挡的车型哦:1、丰田霸道4000中东版纯正越野利器换了一副全新的面孔重新示人。19款丰田霸道4000依旧保持了非承载式车身及后整体桥式悬挂,新霸道没有大的变化,依旧主打越野市场。

  • 天府书展线下(掀起新浪潮开启)

    8月19日,2022·不是书展在青岛市奥帆中心海上颁奖平台拉开帷幕。作为青岛市首个“独立书展”,2022·不是书展共包含三大板块。搭建多元艺术领域交流平台掀起阅读“新浪潮”据了解,本次活动吸引了近50家文化艺术出版相关领域参展方的积极参与,其中有20多家来自全国各地,有20多家来自本土,包括优质内容出版和传播品牌以及独立艺术家们。

  • 女人常吃竹笋好吗(女人常吃竹笋好不好)

    跟着小编一起来看一看吧!女人常吃竹笋好吗女人常吃竹笋还是比较好的。竹笋里面的蛋白质以及维生素特别的丰富,同时还含有比较多的微量元素,经常食用不仅能够辅助补充身体所需要的营养,而且还能够增强抵抗力,还有的植物蛋白可以降血压,对健康有好处。但是有肝肾功能异常的人最好不要吃,避免造成严重伤害。

  • amd rx 6700xt显卡发售时间(AMD6700XT显卡首发评测)

    AMD6700XT显卡首发评测随着虚拟货币价格不断突破记录,整个显卡市场又陷入了魔幻的局面DIY玩家对着电商页面的“无货”和“预约”,退而求次想到二手市场淘货时,却又发现全都涨价了,只能叫苦连连为了缓解这个现象,NVIDIA和AM。