Cpp--C++中排序常用(菜鸟上路,持续更新)
来源:互联网 发布:exe机器码授权软件 编辑:程序博客网 时间:2024/05/21 17:46
bool cmp(int a,int b){ return a>b;}排序的时候就写sort(a,a+100,cmp);
struct node{ int a; int b; double c;}
有一个node类型的数组node arr[100],想对它进行排序:先按a值升序排列,如果a值相同,再按b值降序排列,如果b还相同,就按c降序排列。就可以写这样一个比较函数:
以下是代码片段:
bool cmp(node x,node y){ if(x.a!=y.a) return x.aif(x.b!=y.b) return x.b>y.b; return return x.c>y.c;}排序时写sort(arr,a+100,cmp);
qsort(s[0],n,sizeof(s[0]),cmp);int cmp(const void *a,const void *b){ return *(int *)a-*(int *)b;}
下面分类讨论:
一、对int类型数组排序
int num[100]; int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; } qsort(num,100,sizeof(num[0]),cmp);二、对char类型数组排序(同int类型)
char word[100]; int cmp( const void *a , const void *b ) { return *(char *)a - *(int *)b; } qsort(word,100,sizeof(word[0]),cmp);三、对double类型数组排序(特别要注意)
double in[100]; int cmp( const void *a , const void *b ) { return *(double *)a > *(double *)b ? 1 : -1; } qsort(in,100,sizeof(in[0]),cmp);四、对结构体一级排序
<pre name="code" class="cpp">struct In { double data; int other; }s[100] //按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写 int cmp( const void *a ,const void *b) { return ((In *)a)->data - ((In *)b)->data ; } qsort(s,100,sizeof(s[0]),cmp);
五、对结构体
struct In { int x; int y; }s[100]; //按照x从小到大排序,当x相等时按照y从大到小排序 int cmp( const void *a , const void *b ) { struct In *c = (In *)a; struct In *d = (In *)b; if(c->x != d->x) return c->x - d->x; else return d->y - c->y; } qsort(s,100,sizeof(s[0]),cmp);六、对字符串进行排序
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);七、对枚举型进行排序
enum Enumcomp{ASC,DESC};
然后开始用一个类来描述这个函数对象。它会根据它的参数来决定是采用“<”还是“>”。
class compare{ private: Enumcomp comp; public: compare(Enumcomp c):comp(c) {}; bool operator () (int num1,int num2) { switch(comp) { case ASC: return num1<num2; case DESC: return num1>num2; } }};接下来使用 sort(begin,end,compare(ASC)实现升序,sort(begin,end,compare(DESC)实现降序。
主函数为:
int main(){ int a[20]={2,4,1,23,5,76,0,43,24,65},i; for(i=0;i<20;i++) cout<<a[i]<<endl; sort(a,a+20,compare(DESC)); for(i=0;i<20;i++) cout<<a[i]<<endl; return 0;}
八、利用函数模版进行排序任务
其实对于这么简单的任务(类型支持“<”、“>”等比较运算符),完全没必要自己写一个类出来。标准库里已经有现成的了,就在functional里,include进来就行了。functional提供了一堆基于模板的比较函数对象。它们是(看名字就知道意思了):equal_to<Type>、not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>。对于这个问题来说,greater和less就足够了,直接拿过来用:
- 升序:sort(begin,end,less<data-type>());
- 降序:sort(begin,end,greater<data-type>()).
int _tmain(int argc, _TCHAR* argv[]){ int a[20]={2,4,1,23,5,76,0,43,24,65},i; for(i=0;i<20;i++) cout<<a[i]<<endl; sort(a,a+20,greater<int>()); for(i=0;i<20;i++) cout<<a[i]<<endl; return 0;}
九、迭代器中string排序
既然有迭代器,如果是string 就可以使用反向迭代器来完成逆序排列,程序如下:
int main(){ string str("cvicses"); string s(str.rbegin(),str.rend()); cout << s <<endl; return 0;}
附上C++中另外函数:
函数名 功能描述
sort 对给定区间所有元素进行排序
stable_sort 对给定区间所有元素进行稳定排序
partial_sort 对给定区间所有元素部分排序
partial_sort_copy 对给定区间复制并排序
nth_element 找出给定区间的某个位置对应的元素
is_sorted 判断一个区间是否已经排好序
partition 使得符合某个条件的元素放在前面
stable_partition 相对稳定的使得符合某个条件的元素放在前面
- Cpp--C++中排序常用(菜鸟上路,持续更新)
- C语言版各种排序算法(持续更新中)
- c语言排序(持续更新)
- 排序小结(持续更新中。。。)
- Javascript排序算法(持续更新中...)
- 排序算法总结(持续更新中)
- 【菜鸟linux教程】linux下gcc执行cpp或者c文件(持续添加新内容)
- iOS --- 总结Objective-C中常用的宏定义(持续更新中)
- C/C++ 基础(持续更新中)
- c语言练习题(持续更新中)
- 常用插件,持续更新中~~
- 常用排序算法总结。【力求持续更新】
- 菜鸟学Django(持续更新)
- C/C++常用函数备份(持续更新)
- C语言字符串常用操作(持续更新...)
- 常用正则(持续更新)
- 常用网址(持续更新)
- 开发中常用代码片段汇总(持续更新)
- CentOS6.5下设置静态IP
- 有用的图像处理网站
- pyqt的基本组件
- SSDP (Simple Sever Discovery Protocol)
- 1.hello word 程序
- Cpp--C++中排序常用(菜鸟上路,持续更新)
- 关于自定义Dialog的问题
- 详解神秘Linux内核
- 计算机视觉各种数据库
- php操作redis缓存方法
- 分布式与集群的区别
- JAVA设计模式学习——责任链模式
- 静态页面使用ajax刷新页面访问量通过easyui实现
- Adobe和Dropbox合作推出PDF云编辑版