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

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

    推荐阅读
  • 虾滑是什么(虾滑的解释)

    接下来我们就一起去研究一下吧!虾滑是什么虾滑是一种虾泥食品,是将虾肉打碎,和淀粉按照一定比例混合制成的肉糜状物。虾滑经过上千次的捶打,具有粘性,烹煮后口感爽滑,受到了大众的喜爱,并且虾滑含有丰富的蛋白质和不饱和脂肪酸,能够补肾养血,有利于人体健康。

  • 野山菌馄饨的做法(野山菌馄饨怎么做)

    野山菌馄饨的做法食材:馄饨皮50个、猪肉馅500克、鸡枞100克、真姬菇150克、鸡蛋2个、紫菜30克、食盐5克、生抽8克、香油10克、香菜10克、高汤适量、胡椒粉3克、姜汁5克、生粉3克肉剁成蓉。用手挤干水后加入到肉馅中。接下来就是包馄饨了,肉馅放在馄饨皮的中间。将馄饨皮照着图片上的样子折好。两只手分别捏住馄饨皮的一角,向中间靠拢。生馄饨开水入锅,煮到馄饨浮上水面就说明熟了,用漏勺捞出放入碗中。

  • 鹅莓的种植注意事项,鹅莓怎么施肥 鹅莓适合种植地区

    鹅莓是一种浆果,又称鹅莓和刺李。选址与种植鹅莓喜欢中性和微酸性土壤,这需要疏松肥沃的土壤。适当增加土壤腐殖质,加厚土层,可促进鹅莓的生长发育。肥水管理鹅莓生长期间,应经常松土除草。因此,应及时处理,以达到最佳的产量和质量。病虫害防治鹅莓主要病虫害为白粉病和双翅目。白粉病主要危害叶片,在叶片上形成白色霉菌层。以上是鹅莓栽培技术的介绍。

  • 猪尿水处理最新方法(怎样处理猪尿水)

    接下来我们就一起去了解一下吧!猪尿水处理最新方法猪舍里的猪尿水,首先经过沼气池发酵处理。然后流入3个过滤池净化,净化后,抽入fxpf系列方型溶气气浮机进行抽泡处理。然后流入积淀池沉淀,沉淀后再流入fxz—a地理式生活污水处理设备进行氨氮和总磷处理,最后变成清洁水直接外排。

  • 开个火锅店一个月能赚多少(你认为有空手套白狼的事吗)

    下午回家后,李叔叔把自己所有的钱都拿了出来,总共才1500多,这是5个月的工资;1500元和6万元,相差很远,李叔叔花了600元买了一个二手手机,然后打电话给亲戚朋友,说自己开了一家火锅店,这是自己的电话,有时间来玩。李叔叔把3000元现金给了火锅店老板。问题来了,李叔叔他们30天能赚到6.5万元,来给转让费吗?

  • 澳门超过拉斯维加斯了吗(澳门对比拉斯维加斯)

    随着社会的进步,经济收入五花八门,资源、工业、科技、信息、人力等等都可以给当地带来发展,在世界上有几个地方的经济发展比较特殊,主要依靠博彩,澳门和拉斯维加斯更是其中的佼佼者。一面天堂,一面地狱,博彩成为了拉斯维加斯的主要经济支柱,不仅美国各地的财产大亨,甚至日本的富豪,阿拉伯的王子都来这儿投资。

  • 膝关节积液半月板损伤后遗症(膝关节积液肿胀)

    膝关节是人体滑膜最多、关节面最大和结构最复杂的关节,由于膝关节滑膜广泛并位于肢体较表浅部位,故遭受损伤和感染的机会较多,膝关节滑膜炎主要是因膝关节扭伤和多种关节内损伤而造成的一组综合症。青壮年多因急性创伤和慢性损伤所致。长期慢性膝关节劳损或者轻伤加上风、寒、湿邪侵袭,可使膝关节逐渐出现肿胀和功能障碍,则形成慢性膝关节滑膜炎。

  • 根与系数的关系是怎么得到的(根与系数的关系)

    数姐有话一元二次方程中跟与系数的关系,是中考的一个难点,在未来高中阶段,也是一个常考的点,所以,同学们在初学这块内容时,要多多研究透彻!

  • 工资个税excel计算公式(终于做好了全自动工资核算管理系统)

    每到月初月末,会计人员都会比较繁忙!马上就进入5月份了,企业要在5月底结束企业所得税年报工作!全自动excel工资核算管理系统,300人的工资不到20分钟就能核算完,员工个税能自动计算,还能自动生成工资条!全自动工资核算系统新个税自动计算器1、员工基本信息登记表2、员工工资表(带公式)3、员工工资条4、员工工资明细查询功能5、工资扣款明细表6、员工获得奖金明细表……上述就是全自动excel工资核算管理系统的操作说明了!

  • 2022连云港市海州区文化艺术类校外培训机构有序复工

    如检查发现违反疫情防控有关规定的,一次给予警告整改,二次给予停业整顿。复工材料提交地址为海州区文化馆》》》