qsort和sort的用法

1 、前言

qsort是c语言的快速排序函数,需要调用头文件stdlib.h(cstdlib)
sort是c++中的快排,头文件algorithm

2、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。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值