浅谈sort()与qsort()的应用

现在写代码时,经常会用到排序算法,而每次都敲出一个快排或归并等排序算法太麻烦了(虽然我存了不少代码,但总要做一些修改,挺麻烦的)。但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内
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远的水面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值