现在写代码时,经常会用到排序算法,而每次都敲出一个快排或归并等排序算法太麻烦了(虽然我存了不少代码,但总要做一些修改,挺麻烦的)。但c++中有两个函数,可以简单的完成排序,那就是sort()和qsort(),其中前者更是会自动选择更有效率的排序方法(~ ̄▽ ̄)~真乃福音是也。今天我对二者进行小小的总结。
qsort ( ):这个函数使用的是快速排序算法,有nlogn的时间复杂度,是一个很有效的算法。头文件为stdlib,定义如下:
void qsort(void* base,size_t num,size_t size,int(*comparator)(const void*,const void*));
其中base为数组地址,num为要对前num个数进行排序,size为一个单元所占字节数,最后一个为自定义排序法则。对double型数组的升序排序示例如下:
/********快速排序************/
int cmp(const void *a,const void *b)
{
return *(double*)a-*(double*)b>0?1:-1; //升序
}
qsort(a,n,sizeof(double),cmp); //对a数组的前n个数排序
/****************************/
对自定义(打包为类/结构体)类型示例如下:
class adre
{
public:
int x,y;
};
int cmp(const void*a,const void*b)
{
if((*(adre*)a).x!=(*(adre*)b).x)
return (*(adre*)a).x<(*(adre*)b).x; //优先以x升序排序
return (*(adre*)a).y<(*(adre*)b).y; //x相同时以y升序排序
}
qsort(a,n,sizeof(adre),cmp);
代码中的强制转换(adre*)a,是因为参数传递时为void型,可以接受多种变量类型。
在强制转换前面的*是为了取值。
sort():这个函数在各方面性能均优于qsort(),在头文件algorithm里,定义如下:
void sort ( RandomAccessIterator first, RandomAccessIterator last );
void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
其中first和last为地址,一般为a和a+n,comp为自定义排序法则(比qsort的法则简单)。对int型数组排序示例如下:
/******排序***************/
int cmp(int a,int b)
{
return a<b; //升序
}
sort(a,a+n,cmp);
/*************************/
对自定义(结构体/类)类型排序示例如下:
class adre
{
public:
int x,y;
};
int cmp(adre a,adre b)
{
if(a.x!=b.x) return a.x<b.x; //优先x升序
return a.y<b.y; //其次y升序
}
sort(a,a+n,cmp);
另外:
sort(a,a+n,greater<int>()); //降序排列(大的在前嘛)
sort(a,a+n,less<int>()); //升序排列
//这两个函数包括在functional内