qsort 调用技巧
2016-06-23 22:03
225 查看
//所在头文件 :stdlib.h //<本文中排序都是采用的从小到大排序> /*这里的原理是将值返回给qsort函数,比较函数返回大于0,qsort就认为 a>b , 如果比较函数返回等于0 qsort就认为a 和b 这两个元素相等,返回小于零 qsort就认为 a<b*/
0.主函数
int main() { qsort(数组的首地址,需要排序的数量,sizeof(A[0]),cmp); return 0; }
1.对于int型数组进行排序
int cmp(const void *a,const void *b) { return *(int *)a-*(int *)b; }
2.对于char型数组进行排序(其基本原理同int型数组排序)
int cmp(const void *a ,const void *b) { return *(char *)a-*(char *)b; }
3.对于double型数组进行排序(注意 double型不能偷懒返回a-b(因为a-b是double型)
int cmp(const void *a ,const void *b) { return *(double *)a>*(double *)b?1:-1; }
4.对于结构体数组一级进行排序
typedef struct { int data; int other; } name;//类似该结构体即可 name test[100]; int cmp(const void *a ,const void *b) { return (*(name *)a).data-(*(name *)b).data; }//排序关键字就是data(注意若为浮点型关键字,请仿照double写返回值语句)
5.对于结构体数组二级进行排序
//基本原理是当第一个关键字相同时,利用第二个关键字比较 name test[100]; int cmp(const void *a ,const void *b) { name *M=(name* )a,N=(name* )a; if(M->other!=N->other) return other->m-N->other; else return M->data!=N->data; } }//(注意若为浮点型关键字,请仿照double写返回值语句) /*一般这个时候都在cmp函数里面先强制转换了类型,不要在return里面,这样程序会更清晰,并且绝对是没错的.*/ 6.对字符串进行排序
1.普通二维数组存放
int cmp(const void*a,const void*b) { return strcmp((char *)a,(char *)b); } qsort(数组的首地址,需要排序的数量,sizeof(A[0]),cmp);
程序示例:
#include <stdio.h> #include <stdlib.h> #include <string.h> int cmp(const void*a,const void*b) { return -strcmp((char *)a,(char *)b); } char c[10][10]; int main() { int i,j; for(i=5;i>=0;i--) for(j=0;j<7;j++) c[i][j]=i+'A'; printf("排序前\n"); for(i=0;i<=5;i++) puts(c[i]); qsort(c,6,sizeof(c[0]),cmp); printf("排序后\n"); for(i=0;i<=5;i++) puts(c[i]); return 0; }
2.用结构体存储
struct In { int data; char str[100]; }s[100]; //按照结构体中字符串str的字典顺序排序 int cmp ( const void *a , const void *b ) {return strcmp( (*(In *)a)->str , (*(In *)b)->str );} qsort(s,100,sizeof(s[0]),cmp);//原理同上
七、计算几何中求凸包的cmp//尚未验证
int cmp(const void *a,const void *b) //重点cmp函数,把除了1点外的所有点,旋转角度排序 { struct point *c=(point *)a; struct point *d=(point *)b; if( calc(*c,*d,p[1]) < 0) return 1; else if( !calc(*c,*d,p[1]) && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y)) //如果在一条直线上,则把远的放在前面 return 1; else return -1; }
相关文章推荐
- lsb_release安装
- 学习心得体会
- SQL语句中SUM与COUNT的区别深入分析
- Json解析较为复杂的数据(Map中含有List)从服务器获取城市数据实现三级联动
- mybatis ehcache的一点小记
- github
- HttpServletRequest 和 HttpServletResponse对象
- 64位整型使用
- 组件映射与继承映射
- 15.1
- BZOJ1854: [Scoi2010]游戏
- 详解Java集合框架的接口和类层次关系
- 2021发工资咯:)
- HDU 1063 && POJ 1001 Exponentiation (JAVA浮点数大数)
- 有道词典python 代码(暂有缺憾)
- Centos6.8 64位编译安装PF_RING心得和总结
- leetcode 205 Isomorphic Strings
- SDWebImage原理
- LNMP环境搭建之--YUM仓库
- C++学习心得