qsort和sort的用法
2016-05-15 21:31
337 查看
11、前言
qsort是c语言的快速排序函数,需要调用头文件stdlib.h(cstdlib)sort是c++中的快排,头文件algorithm
22、c语言中的qsort函数
原型:void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
参数说明
- base:排序数组的基地址
- nmemb:排序数组的大小(需要排序的个数\连续地址)
- size:数组成员的大小(sizeof(a[0]))
- compar:比较函数,即比较规则
比如:
qsort(a,100,sizeof(a[0]),comp);
就是对数组a排序,是从a[0]到a[99]进行排序(如果数组类型为int,数组成员大小可以改成sizeof(int),如果是结构体参数依旧是结构体的大小,而不是你要排序的date的大小,请看下面一组代码),compare(为排序规则,需要自己给出。
假设要对100个student的date进行排序:
typedef struct{ int date; char name; }Student; Student s[100]; qsort(s,100,sizeof(Student),comp);
下面详细说一下自定义的compare比较函数怎么写:
原型
int compare(const void *a, const void *b){ }
compar函数的参数是两个const void的指针,这两个指针分别指向base数组的两个成员,其中a在b的后面,也就是说a的数组下标大与b的数组下标
最终的结果是按照compar的返回值(int类型)为负进行排序,也就是说,当返回值为负时,a与b位置互换,否则不互换。
比如对int类型数组从小到大排序:
int compare(const void *a, const void *b) { return *(int*)a - *(int*)b; }
当需要为结构体某一成员排序时如下(依旧用上文提到的Student):
两个const void指针指向的依旧是数组成员,只不过比较时即return语句用到了*a.date
int compare(const void *a,const void *b){ return (*(Student*)a).date-(*(Student*)b).date }
3、c++中的sort
c++中STL sort算法根据不同需求有很多种,比如sort、stable_sort、partial_sort等等,具体可以看http://www.cppblog.com/mzty/archive/2005/12/15/1770.html的介绍这里只针对sort说说:
c++中的sort一般有两种形式:
第一种形式:
template <class RandomAccessIterator> void sort (RandomAccessIterator first, RandomAccessIterator last);
只用两个迭代器(iterator)限定排序范围,这里的迭代器都是随机迭代器(RadomAccessIterator),也就是可以随机访问的迭代器,如it+n什么的。这里没有自定义比较函数,程序将自动给你提供一个比较函数。
例如:
vector < int > vect; //... sort(vect.begin(), vect.end()); //此时相当于调用 sort(vect.begin(), vect.end(), less<int>() );
其中less是系统提供的仿函数,这并于一定适用于你的算法,这里不过多叙说。重点看看第二种自定义重载的()函数,功能与qsort中的compare类似。
第二种形式是:
template <class RandomAccessIterator, class Compare> void sort (RandomAccessIterator first, RandomAccessIterator last, Compare c
除了随机访问的迭代器限定的范围外,还有一个参数comp,即排序规则。
comp是二元函数,这里需要注意,它与qsort中的comp有所不同:它接收的是两个迭代器范围内的成员 (而qsort中是const void 指针),并且它的返回值类型为bool型,排序规则是使得comp为true,也就是说当其返回值为true时a与b才交换位置,看下面例子:
int arr[]={4,5,2,7,1} bool comp(int a, int b) { return b - a; } sort(arr, arr+5, comp);
即对arr数组进行排序,排序的范围为[arr,arr+5)这么一个闭区间,即arr[0]到arr[4],可以看出comp规则为从小到大排序。
小结
上面简单介绍了C语言中的qsort和C++中的sort。参数基本都是排序范围和排序规则。不同的是:
qsort使用基地址和元素个数确定排序范围,sort使用两个迭代器确定排序范围。
qsort的排序规则的参数类型为指针,sort的参数类型为排序成员类型。
qsort的排序规则的返回值为int,sort的排序规则的返回值为bool。
qsort的排序使得排序规则返回负值,sort的排序使得返回值为true。
相关文章推荐
- 设计模式六大原则:接口隔离原则(六)
- Qt窗口之QMainWindow、QDialog、QWidget
- 4.机器学习实战之朴素贝叶斯
- 大话设计模式java版--抽象工厂模式
- ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法 listener.ora修改
- php读取数据库信息的几种方法
- 使用pullToRefresh实现下拉刷新上拉加载
- php以图搜图
- 如何下载Instagram照片/视频到手机
- 【软考总结】——十六进制与二进制的转换
- 2016"百度之星" - 资格赛 Problem C
- 2016SDAU编程练习三1001
- ORA-12514 startup mount时遇到ORA-12514
- 团队作业五
- 通过CIFilter生成二维码
- git,切换以前的版本,增加代码,然后合并的操作步骤
- 20159217《网络攻防实践》第十一周学习总结
- 第四次作业
- Android Lint官方静态代码检查工具
- ora-01950:对表空间XXX无权限