sort和qsort使用模板

来源:互联网 发布:海纳百川软件用不了 编辑:程序博客网 时间:2024/06/08 06:02

写在最前面的

      在csdn上开了一个博客,一直就听说这里挺火的,更重要的是,能和大牛们学习,受益匪浅啊。我非常喜欢UI编程,对VC很热衷,同时我也喜欢上了算法,但是数学一直是个瓶颈,一直都是“半桶水”,尽管如此,我还是会在博客中写写讨论有关UI和算法的学习笔记(算不上是什么文章咯。^_^),希望可以共同学习进步。

      另外,外链一个博客,捣乱小子,这是我的同名博客,以前一直在那里混。下面是我的第一篇,特别水啊...在c/c++当中,有很多的模板可以用。下面介绍一下sort和qsort,学习笔记

sort和qsort的使用

sort和qsort的使用方法。

template<class RandomAccessIterator>   void sort(      RandomAccessIterator _First,       RandomAccessIterator _Last   );template<class RandomAccessIterator, class Predicate>   void sort(      RandomAccessIterator _First,       RandomAccessIterator _Last,       Predicate _Comp   );

在MSDN上如是说,来个最简单的数组排序。
#include <iostream>#include <algorithm>using namespace std;bool cmp(int &a,int &b){return a<b;}//返回true是升序,返回false是降序void show(int *a,int n){for(int i=0; i<n; i++)cout << a[i] << " ";cout << endl;}int main(){//测试数据int a[5] = {5,4,3,2,1};sort(a,a+5,cmp);show(a,5);}

sort不仅仅基于基本数据类型的排序。假设,有一个学生信息的数据结构:
struct student{int num;char name[20];int mark;}s[100];

接着,假想s[100]已经填充了数据,有需求要将100个学生按照mark成绩的顺序来排序,那么同样可以用上面的方法来解决。但是在cmp函数需要小小的修改,学号和姓名会随着成绩“走”。
bool cmp(student &a,student &b){return a.mark<b.;}//返回true是升序,返回false是降序

又有需求,如果两个学生的成绩相同,则相同成绩的学生排序需要按照学生姓名的字典顺序(abcd...不分大小写)来排序。同样修改cmp就可以。
bool cmp(student &a,student &b){if(a.mark==b.mark)return strcmp(a.name,b.name);return a.mark<b.mark;}//返回true是升序,返回false是降序

qsort听说比sort低效,不是很清楚,但是也经常用。MSDN上如是说:
void qsort(   void *base,   size_t num,   size_t width,   int (__cdecl *compare )(const void *, const void *) );

简单数组排列的例子:
#include <iostream>#include <algorithm>using namespace std;int cmp(const void * a,const void * b){int * pa = (int *)a,* pb = (int *)b;return *pa-*pb;}void show(int *a,int n){for(int i=0; i<n; i++)cout << a[i] << " ";cout << endl;}int main(){int a[5] = {5,4,3,2,1};//sort(a,a+5,cmp);qsort(a,5,sizeof(int),cmp);show(a,5);}

同样,学生成绩排序情况也可以这样。主要是修改cmp
int cmp(const void * a,const void * b){student * pa = (student *)a,* pb = (student *)b;if(pa->mark==pb->mark)return strcmp(pa->name,pb->name);return pa->mark-pb->mark;}

都是算法里面的模板来的,做题的时候用得着。


本文完。2012-03-19

捣乱小子 http://blog.csdn.net/daoluanxiaozi


原创粉丝点击