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。