关于c++中的sort有些时候不然C语言的qsort这件事

文章通过实验比较了C++中的sort、stable_sort与C库中的qsort函数在不同数据量下的性能。实验结果显示,当数据量较大时,qsort在速度上有优势,特别是在处理静态多维数组和C风格字符串时,由于其类型不安全但灵活的特性,使得在某些场景下比C++的sort更便捷。然而,sort提供了稳定性且使用更方便。
摘要由CSDN通过智能技术生成

众所周知,c++中有stl库中自带的sort函数,进一步说,还有stable_sort来增加稳定性

但是,别忘了,在c库<stdlib.h>库中,还有一个按位排序的qsort算法,类似于

qsort(目标数组名,排序元素个数,排序元素单个的大小,排序函数(入参均为const void*,返回值为int类型,不能像c++这样随意))

但是——它都标明了q(quick)了,和c++sort相比会如何呢?是逊色很多,还是名副其实?

实验如下:(int为例)

#include<iostream>

#include<random>

#include<algorithm>

#include<time.h>

#define arrlen(ar) (sizeof(ar)/sizeof((ar)[0]))

#define arrmove(a,b) memcpy(a,b,sizeof(b))

#include<memory.h>

using namespace std;

#define qsort_cmper(name,type)\

int name(const void *a,const void *b)\

{if(*(type*)a<*(type*)b)return -1;\

if(*(type*)b<*(type*)a)return 1;\

return 0;}//关于qsortcmp的通用写法 

qsort_cmper(ccmp,int)

#define N 10000000//10^7级 

random_device ram;

uniform_int_distribution<int>kg(-1000000,1000000);

//为了避免rand这个伪随机数垃圾重复出数字 

int a[N],s[N];

int main(){

for(int i=0;i<arrlen(a);++i)a[i]=kg(ram);

arrmove(s,a);

clock_t e=clock(),b;

sort(s,s+N); 

b=clock();

printf("%lld\n",b-e);

arrmove(s,a);

e=clock();

stable_sort(s,s+N);

b=clock();

printf("%lld\n",b-e);

arrmove(s,a);

e=clock();

qsort(s,N,4,ccmp);

b=clock();

printf("%lld\n",b-e);

}

结果是这样的

Sort:3586

Stable_sort:3725

Qsort:3120

但在10^5的条件下:

Sort:20

Stable_sort:30

Qsort:25

所以说,Qsort的绝对优势实在数据量很多(如10^6的状态下),但Sort更方便。

你看这个Stable_sort就是逊也~

qsort还有一个sort不可达到的方式,那就是对于静态多维数组(二维数组)排序。

学过c++的都知道,数组作为c++的特色,不能直接用=赋值,传达参数也得用指向数组的指针,贼麻烦,而sort不仅用类安全加大了麻烦,而且赋值操作还直接拒中括号静态数组鱼门外

而qsort就不同了,void*传递避免类型问题(“类型不安全”),交换按位交换,省去等号烦恼,而传递的比较参数稍加类型转换就能在数组上操作,只需要写好单个元素的大小和比较函数就比c++不知好上太多(虽然c++有vector)

就拿c风格字符串来说吧:

#include<iostream>

#include<string.h>

#include<stdlib.h>

#include<algorithm> 

using namespace std;

char a[21][100]={"I love your mother fucker","The car I just bought","I fuck your mum","Fuck You!","The car is still new!","Fuck you mother","Your Mother Fucker the car I just bought"};

int main(){

qsort(a,7,100,(int (*)(const void*,const void*))strcmp);//没错,强行拉上strcmp

for(int i=0;i<7;i++)cout<<a[i]<<'\n';

So~在数据过大时排序与排序c风格二维数组时,sort不如qsort

如果喜欢的话,就关注小金鱼我吧~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值