您的位置:首页 > 其它

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: