cmp函数在sort中的应用qsor快排序以及cmp函数

举报
irrational 发表于 2022/01/17 23:51:45 2022/01/17
【摘要】 qsor快排序以及cmp函数 void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*)); 各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针 头文...

qsor快排序以及cmp函数

void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));

各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针

头文件:stdlib.h

举例:

char a[1000];

int m=strlen(a);

qsort(a,m,sizeof(a[0]),cmp);

qsort中的cmp函数感觉是用户自定义的,根据其不同的数据类型

接下来介绍不同数据类型所定义的cmp函数

1.int a[1000];int 数组

qsort(a,1000,sizeof(int),comp);

其中comp函数应写为:

int cmp(const void *a,const void *b)

{

return *(int*)a-*(int*)b;

}

Compare 函数的返回值

描述

< 0

elem1将被排在elem2前面

0

elem1 等于 elem2

> 0

elem1 将被排在elem2后面

注明:*(int*)a就是取a指向的内容的意思。

上面是由小到大排序,return *(int *)b - *(int *)a; 为由大到小排序。

2.char a[20];  字符数组

qsort(a,20,sizeof(a[0]),cmp);


  
  1. int find(char b,char a)
  2. {
  3. if(a <= 'Z' && a >= 'A' && b <= 'Z' && b >= 'A')
  4. return a < b;
  5. if(a <= 'z' && a >= 'a' && b <= 'z' && b >= 'a')
  6. return a < b;
  7. if(a <= 'Z' && a >= 'A' && b <= 'z' && b >= 'a')
  8. return a + 32 <= b;
  9. if(a<='z' && a >='a' && b <= 'Z' && b >= 'A')
  10. return a < (b + 32);
  11. }
  12. int cmp(const void *a,const void *b)
  13. {
  14. return find(*(char *)a,*(char *)b); //*(char *)a就是取a指向的内容的意思
  15. }

3.int a[1000][2];二维数组


  
  1. qsort(a,1000,sizeof(int)*2,cmp);
  2. int comp(const void*a,const void*b)
  3. {
  4. return((int*)a)[0]-((int*)b)[0];
  5. }

4.对字符串进行排序


  
  1. int Comp(const void*p1,const void*p2)
  2. {
  3. return strcmp((char*)p2,(char*)p1);
  4. }
  5. int main()
  6. {
  7. char a[MAX1][MAX2];
  8. initial(a);
  9. qsort(a,length,sizeof(a[0]),Comp);
  10. //length为数组a的长度

5.按结构体中某个关键字排序(对结构体一级排序)


  
  1. structNode
  2. {
  3. double data;
  4. int other;
  5. }s[100];
  6. int Comp(constvoid*p1,constvoid*p2)
  7. {
  8. return(*(Node*)p2).data>(*(Node*)p1).data?1:-1;
  9. }
  10. qsort(s,100,sizeof(s[0]),Comp);

6.按结构体中多个关键字排序(对结构体多级排序)[以二级为例]:


  
  1. struct Node
  2. {
  3. int x;
  4. int y;
  5. }s[100];
  6. //按照x从小到大排序,当x相等时按y从大到小排序
  7. int Comp(const void*p1,const void*p2)
  8. {
  9. struct Node*c=(Node*)p1;
  10. struct Node*d=(Node*)p2;
  11. if(c->x!=d->x)returnc->x-d->x;
  12. else return d->y-c->y;
  13. }

7.对结构体中字符串进行排序:


  
  1. struct Node
  2. {
  3. int data;
  4. char str[100];
  5. }s[100];
  6. //按照结构体中字符串str的字典序排序
  7. int Comp(const void*p1,const void*p2)
  8. {
  9. return strcmp((*(Node*)p1).str,(*(Node*)p2).str);
  10. }
  11. qsort(s,100,sizeof(s[0]),Comp);

  

转载于:https://www.cnblogs.com/Aiahtwo/p/10512033.html

接下来,让我们在之后题目中感受cmp的魅力吧,他让我们自定义的东西可以调用库函数,可谓是开发者和程序包之间的美丽桥梁。

文章来源: blog.csdn.net,作者:irrationality,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_54227557/article/details/120581162

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。