C++ <algorithm>Sort()函数秒杀任何常用排序算法

c++标准函数库algorithm中的sort函数 sort函数使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n),执行效率较高! Sort函数包含在头文件为#include<algorithm>的c++标准库 sort(1,2,3)//三个参数 sort函数三种使用方法  1.sort函数中没有第三个参数(默认从小到大) //sort 函数不传参数 #include<iostream> #incl... 阅读详情

算法(Algorithm) 

代表着用系统的方法描述解决问题的策略机制,可以通过一定规范的 输入,在有限时间内获得所需要的 输出。

一个算法的好坏是通过 时间复杂度 与 空间复杂度 来衡量的。就是代码需要的时间和内存,也就你时间成本和空间成本。其实这个一个动态的调整,到一定程度,往往就是用空间去换取时间,或者去时间去换取空间(dp其实就是在用空间去换取时间)。当然优秀的代码就是很优秀,排序也是这样,他们的目标都是把一堆数字进行排序。

常见时间复杂度的 “大O表示法” 描述有以下几种:

时间复杂度非正式术语
O(1)常数阶
O(n)线性阶
O(n2)平方阶
O(log n)对数阶
O(n log n)线性对数阶
O(n3)立方阶
O(2n)指数阶

一个算法在N规模下所消耗的时间消耗从大到小如下:

O(1) < O(log n) < O(n) < O(n log n) < O(n2) < O(n3) < O(2n)

常见的排序算法

根据时间复杂度的不同,常见的算法可以分为3大类。

1.O(n²) 的排序算法

  • 冒泡排序

  • 选择排序

  • 插入排序

2.O(nlogn) 的排序算法

  • 堆排序

  • 希尔排序   //O(nlog²n) ~ 最坏时O(n²)

  • 归并排序   //O(nlogn) ~ 最坏时O(nlog²n)

  • 快速排序   //O(nlogn) ~ 最坏时O(n²)

3.线性O(n)的排序算法

  • 桶排序

  • 计数排序   //O(n+m)

  • 基数排序   //O(kn) ~ 最坏时O(n²)

以下代码对C++算法库<algorithm>里的Sort()函数,进行排序用时测试,排列1亿个随机整数居然只用34秒,1000万个数只用2.6秒。

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <array>
#include <algorithm>
using namespace std;

int main(void)
{
	const unsigned int num = 100000000; 
	static array <int,num> arr;
	clock_t tClock;

	srand(time(NULL)+rand());
	
	cout<<"随机生成"<<arr.size()<<"个"<<arr.size()<<"以内的整数:"<<endl;
	tClock = clock();
	for_each(arr.begin(),arr.end(),[](int &i)->void{i=rand()%arr.size();});
	tClock = clock() - tClock;
	cout<<"随机赋值"<<num<<"个整数共耗时:"<< tClock <<"毫秒"<<endl;
	
	cout<<"\n<algorithm>库算法Sort()排序:"<<endl;
	tClock = clock();
	sort(arr.begin(),arr.end());
	//reverse(arr.begin(),arr.end()); //再倒序即成降序;倒序百万个数只要10毫秒左右 
	tClock = clock() - tClock;
	cout<<"库函数排序"<<num<<"个整数耗时:"<< tClock <<"毫秒"<<endl;
		
	return 0;
}

/* 
排序 1亿个 整数的测试结果:

随机生成100000000个100000000以内的整数:
随机赋值100000000个整数共耗时:2656毫秒

<algorithm>库算法Sort()排序:
库函数排序100000000个整数耗时:34411毫秒

--------------------------------
Process exited after 37.98 seconds with return value 0
请按任意键继续. . .
*/

/* 
排序1000万个数的测试结果:
 
随机生成10000000个10000000以内的整数:
随机赋值10000000个整数共耗时:265毫秒

<algorithm>库算法Sort()排序:
库函数排序10000000个整数耗时:3074毫秒

--------------------------------
Process exited after 4.106 seconds with return value 0
请按任意键继续. . .
*/

把num值降至100000,sort()与其他排序法的耗时对比:

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <array>
#include <algorithm>
using namespace std;

int main(void)
{
	const unsigned int num = 100000; 
	static array <int,num> arr,tmp;
	clock_t tClock;

	srand(time(NULL)+rand());
	
	cout<<"随机生成"<<tmp.size()<<"个"<<tmp.size()<<"以内的整数:"<<endl;
	tClock = clock();
	for_each(tmp.begin(),tmp.end(),[](int &i)->void{i=rand()%tmp.size();});
	tClock = clock() - tClock;
	cout<<"随机赋值"<<num<<"个整数共耗时:"<< tClock <<"毫秒"<<endl;
	if (num<=500) for (auto a:tmp) cout<<a<<"\t";
	
	cout<<"\n冒泡排序 Bubble Sort:"<<endl;
	for (int i=0;i<num;i++) arr.at(i)=tmp.at(i);
	tClock = clock();
	for(int i=0;i<arr.size();i++)
        for(int j=1;j<arr.size()-i;++j)
            if(arr.at(j-1)>arr.at(j)) swap(arr.at(j-1),arr.at(j));
	tClock = clock() - tClock;
	if (num<=500){
		cout<<"排序后:"<<endl;
		for (auto a:arr) cout<<a<<"\t";
		cout<<endl;
	}
	cout<<"冒泡排序"<<num<<"个整数耗时:"<< tClock <<"毫秒"<<endl;

	cout<<"\n选择排序 Selection Sort:"<<endl;
	for (int i=0;i<num;i++) arr.at(i)=tmp.at(i);
	tClock = clock();	
    for (int i=0,min;i<arr.size()-1;i++){
        min = i;
        for (int j=i+1;j<arr.size();j++)
            if (arr.at(j)<arr.at(min)) min=j;
        swap(arr.at(i),arr.at(min));
    }
    tClock = clock() - tClock;
	if (num<=500){
		cout<<"排序后:"<<endl;
		for (auto a:arr) cout<<a<<"\t";
		cout<<endl;
	}
	cout<<"选择排序"<<num<<"个整数耗时:"<< tClock <<"毫秒"<<endl;	

	cout<<"\n插入排序 Insertion Sort:"<<endl;
	for (int i=0;i<num;i++) arr.at(i)=tmp.at(i);
	tClock = clock();	
    for (int i=0,j,tmp;i<arr.size()-1;i++){
        j = i;
        tmp = arr.at(i+1);
        while (j>=0 && arr.at(j)>tmp) arr.at(j+1) = arr.at(j--);
        arr.at(j+1) = tmp;
    }
    tClock = clock() - tClock;
	if (num<=500){
		cout<<"排序后:"<<endl;
		for (auto a:arr) cout<<a<<"\t";
		cout<<endl;
	}
	cout<<"插入排序"<<num<<"个整数耗时:"<< tClock <<"毫秒"<<endl;	
	
	cout<<"\n<algorithm>库算法Sort()排序:"<<endl;
	for (int i=0;i<num;i++) arr.at(i)=tmp.at(i);
	tClock = clock();
	sort(arr.begin(),arr.end());
	tClock = clock() - tClock;
	if (num<=500){
		cout<<"排序后:"<<endl;
		for (auto a:arr) cout<<a<<"\t";
		cout<<endl;
	}
	cout<<"库函数排序"<<num<<"个整数耗时:"<< tClock <<"毫秒"<<endl;
		
	return 0;
}

测试结果:真可谓秒杀啊

//第1次测试结果:

随机生成100000个100000以内的整数:
随机赋值100000个整数共耗时:2毫秒

冒泡排序 Bubble Sort:
冒泡排序100000个整数耗时:152607毫秒

选择排序 Selection Sort:
选择排序100000个整数耗时:72822毫秒

插入排序 Insertion Sort:
插入排序100000个整数耗时:45840毫秒

<algorithm>库算法Sort()排序:
库函数排序100000个整数耗时:28毫秒

--------------------------------
Process exited after 272.1 seconds with return value 0
请按任意键继续. . .


//第2次测试结果:

随机生成100000个100000以内的整数:
随机赋值100000个整数共耗时:3毫秒

冒泡排序 Bubble Sort:
冒泡排序100000个整数耗时:151895毫秒

选择排序 Selection Sort:
选择排序100000个整数耗时:73151毫秒

插入排序 Insertion Sort:
插入排序100000个整数耗时:46617毫秒

<algorithm>库算法Sort()排序:
库函数排序100000个整数耗时:25毫秒

--------------------------------
Process exited after 272.6 seconds with return value 0
请按任意键继续. . .


//第3次测试结果:

随机生成100000个100000以内的整数:
随机赋值100000个整数共耗时:3毫秒

冒泡排序 Bubble Sort:
冒泡排序100000个整数耗时:151941毫秒

选择排序 Selection Sort:
选择排序100000个整数耗时:72759毫秒

插入排序 Insertion Sort:
插入排序100000个整数耗时:45291毫秒

<algorithm>库算法Sort()排序:
库函数排序100000个整数耗时:25毫秒

--------------------------------
Process exited after 270.8 seconds with return value 0
请按任意键继续. . .

如果用冒泡排序1亿个数,估计至少得算上2天2夜吧。但在网上看到sort()是基于快速排序的,那n/logn=1250万倍,这样算冒泡法排1亿个数岂不得用86小时??? 

关于sort()具体怎么实现的呢? 据说它的算法是快速排序、归并排序等各种排序方法的综合体。

 

附录:几种排序法的图示

Bubble Sort

bubble sort

Insertion Sort

Selection Sort

Quick Sort

Merge Sort

Merge Sort

C++二级考试真题精讲:面向对象编程与内存管理核心考点解析 面向对象编程(OOP)是C++的核心范式,其核心概念包括类与对象、继承与多态。类通过封装数据和方法实现模块化设计,继承支持代码复用,多态则通过虚函数实现运行时动态绑定,提升程序灵活性。理解这些原理对于构建可扩展、易维护的软件系统至关重要。在工程实践中,掌握内存管理技术如深拷贝与浅拷贝的区别、new/delete的正确使用,能有效避免内存泄漏和程序崩溃。这些基础技术广泛应用于系统开发、游戏引擎和嵌入式领域。本文聚焦全国计算机等级考试二级C++真题精讲,通过剖析历年真题中的高频考点如类的继承中构造函数调用顺序、 阅读详情

相关推荐

C++常用函数之sort函数,头文件 algorithm

sort(起始地址,结束地址,比较器);其中比较器可以省略,默认升序。n),不能满足我们写题的需要。sort函数的排序方法类似于快排方法,时间复杂度为n。1、sort()函数是C++标准库中的排序函数,头文件为algorithm。这里要注意,map函数有一个按key值进行的自动排序功能(升序)我们最熟悉的冒泡排序和选择排序的时间复杂度过高o(n。3、sort()函数的参数。4、对vector排序。5、对map进行排序。......

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 3973

algorithm头文件下的常用函数之sort()

顾名思义,sort()就是用来排序的函数,它根据具体情形使用不同的排序方法,效率较高。一般来说,不推荐使用C语言中的qsort()函数,原因是qsort()用起来比烦琐,涉及很多指针的操作。而且sort()在实现中规避了经典快速排序中可能出现的会导致实际复杂度退化到O(n^2)的极端情况。希望读者能通过这篇介绍来轻松愉快地使用sort函数。 1.如何使用sort()排序 sort()函数的使用...

分享包括但不限于计算机基础知识、数据结构与算法、Golang技术栈。年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐,将复何及! 4390

【信息科学与工程学】【数据中心】第三十五篇 云计算数据中心的学科知识04

编号学科(课程)核心知识点在云计算/云存储/云网络/云安全/云MaaS中的作用代表教材/资料/论文 + 数学方程式列表工业界应用D1421​云原生数据库:TiDB​HTAP(混合事务/分析处理)、分布式SQL、水平扩展、强一致(Raft)、自动故障恢复、与MySQL兼容、TiFlash列式引擎提供弹性扩展的分布式数据库;支撑高并发在线交易与实时分析教材:《TiDB in Action》PingCAP(2020) 论文:《TiDB: A Raft-based HTAP Database》(2017)

weixin_49199313的博客 403

C++ 实现十大排序算法

教你手撕排序,这里有一个概念就是稳定排序。假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。并不是其算法复杂度的稳定,注意一下 代码均经过测试,如果找到代码bug可以留言 算法(Algo...

weixin_38169798的博客 363

AT32F421玩转AM32电调:手把手教你调试过零点比较器,告别电机抖动

本文详细介绍了如何使用AT32F421芯片调试AM32电调的过零点比较器,解决电机抖动问题。通过硬件配置、软件环境搭建、比较器电路原理分析及filter_level参数动态调整等实战步骤,帮助开发者精准诊断和优化电机控制性能。

weixin_42525632的博客 276

【MFiX后处理】MFiX中使用des_usr_var输出颗粒的传热量(2020-11-27更新变更输出变量名方法)

参考之前Yin的那一篇博客 https://www.cnblogs.com/Jay-CFD/p/10621274.html 输出一下颗粒传热量 使用的算例是fluid_bed_dem_2d 打开des scalar tracking 前面都和Yin那篇一样,打开enable user scalar tracking 输入2 因为第一个用来测试Y加速度了 第二个输出传热量 然后在output vtk中勾选好 更改源代码 源代码为des_thermo_newvalues.f 在mfix-GUI自带的ed

beidou111的博客 1532

c++入门必学库函数 sort

sort是c++ algorithm 库里的一个排序函数。排序太常用了,如果每次都要自己写排序函数的话会浪费程序员大量的时间和精力,所以函数库里就写好了一些排序算法以供我们使用。sort()是不稳定的排序,底层使用的是快速排序算法,平均时间复杂度为O(n*log n)如果需要稳定排序可以使用stable_sort(),底层使用归并排序实现的,时间复杂度固定是O(n*log n)sort()和stable_sort()用法是一样的,下面我们只讲解sort()的使用。

weixin_52115456的博客 2万+

配置VS Code使用Linux服务器上的Matlab

0、需求 Linux服务器上安装有Matlab 无图形界面,只能使用命令行工具,编辑文件不方便 1、VS Code插件安装 在扩展商店中搜索matlab,会出现Matlab Extension Pack,里面有整理好的matlab扩展 这里只安装了第一排的三个扩展 2、设置(Windows、Mac的设置类似,只是不同系统的文件路径不同) 安装好扩展,重启VS Code后,进行设置 打开:文件→首选项→设置(或快捷键ctrl+,),搜索matlab,结果如下图所示;直接打开完整json配置文件(图

赵彬的博客 5009

算法学习地图:从排序到动态规划,零基础入门路线全解析

算法学习常因概念繁杂而让人望而却步,而真正的入门关键在于先建立全局认知。排序算法作为最基础的数据组织方式,奠定了对时间与空间复杂度的直觉;动态规划与贪心策略则解决多阶段最优决策问题,是思维跃升的阶梯。理解图论算法中的DFS、BFS与Dijkstra,能让你应对路径搜索与网络分析等真实场景。当精确解不可得时,启发式优化与机器学习算法提供了以精度换效率的工程化思路。本文从算法分类与选型方法切入,梳理四类核心问题的解决范式,并给出三个月从零到上手的实战路径,帮助你避开新手常见误区,真正掌握算法思维而非背诵代码。

weixin_34378767的博客 277

数据讲述中国故事!和鲸助力中国综合社会调查(CGSS)数据分析与可视化大赛圆满收官

用数据研究中国问题、总结中国道路、讲述中国故事。和鲸作为协办单位全程支持本次大赛,为中国人民大学中国调查与数据中心实施全套赛事系统,同时提供完备而周全的赛事运营服务。

ModelWhale的博客 1410

基于非接触式微波雷达设计的跌倒检测预警系统【短信报警】

本项目选择基于非接触式微波雷达的跌倒检测预警装置作为技术核心,采用云帆瑞达的R60AFD1跌倒检测模组。这一模组能够根据人体的运动变化,如速度、距离和姿态等特征,判断是否发生跌倒,并可以持续监控老年人是否处于危险状态。此外,本项目还结合4G通信技术,通过Air724UG模块实现短信报警功能,一旦检测到跌倒事故,系统将自动通过4G网络向紧急联系人发送短信报警,及时通知亲属或医护人员进行救援。

1754

排序算法--Sort Algorithm

一、排序算法的概念: 排序也称排序算法 (Sort Algorithm),排序是将一 组数据,依指定的顺序进行排列 的过程 二、排序算法的分类: 1) 内部排序: 指将需要处理的所有数据都加载 到内部存储器中进行排序。 2) 外部排序法: 数据量过大,无法全部加载到内 存中,需要借助外部存储进行 排序 三、算法的时间复杂度 时间频度:一个算法中的语句执行次数称为语句频度或时间频度。记为T(n) 时间复杂度:一般情况下,算法中的基本操作语句的...

YZG ' BLOG 1797

2026华为OD面试手撕代码真题目录

一般面试的时候每一轮技术面都会出一到两个手撕代码题,这些题的特点就是,非常短小,易于理解。不可能会再出阅读理解一样的机试题的。但是这些题目也非常注意基本功,很注意细节的处理,一般都是easy+medium题目。但是大家一定要注意,因为大部分面试官上面一开始就会让你做题,直接看你所有的做题过程(防止有人水平一般,机试就网上找的答案的蒙混过关),手撕代码题会给你后面的面试定一个基调。

MISAYAONE的博客 9万+

C++ 头文件 —— algorithm 常用函数及其用法(更新中)

sort 函数是 algorithm 中的排序函数,相较于 C stdlib 中的 qsort 函数,用法更简单,也更广泛,同时内部实现也要更复杂。注意:这里的参数是数组的地址。

qq_72585517的博客 2713

制作INCA和CANape通用的A2L

CANape和INCA通用的A2L配置与修改

赞的博客 5961

Web渗/透/攻/击实战(1)—成功渗/透台湾某净化设备公司官网

写在前面 作为一个防御型白帽黑客​ 你一定要知道黑客的进攻套路 才能有相应的防御措施 声明:只做测试,发现对方的漏洞,并不进行破坏性操作 1、 网站分析 地址:http://www.xxx.com.tw/ 这是一家中国台湾地区的网站,看着满屏的繁体字,就不是很舒服 网站首页包括:关于我们、资料下载、联络方式等等。 这些对我们进行sql注入用处并不大 我们需要的是可以进行参数传入的页面,这样我们就可以在参数里做文章 找一下 有没有新闻列表相关的页面 页...

信息安全领域优质创作者|操作系统领域专家 1806

C++ 标准库 <algorithm> 排序函数 sort

摘要:C++ algorithm库中的sort函数可以通过数组的初始地址和结束地址对数组元素进行自定义排序。

AF_MAX的博客 7495

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

sort函数的用法(C++排序库函数的调用)

对数组进行排序,在c++中有库函数帮我们实现,这们就不需要我们自己来编程进行排序了。 (一)为什么要用c++标准库里的排序函数 Sort()函数是c++一种排序方法之一,学会了这种方法也打消我学习c++以来使用的冒泡排序和选择排序所带来的执行效率不高的问题!因为它使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n),执行效率较高! (二)c++标准库里的排序函数的使用方法 I)...

weixin_30680385的博客 1272

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++ Sort函数详解

C++sort函数介绍、案例,自定义排序方法。

zhangbw's blog 15万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Algorithm头文件--sort()函数

在STL标准函数库中提供了一种sort()排序函数,其底层的实现方式是快速排序。该函数的原型:其中的三个参数分别表示:1)start是迭代器的起始地址。2)end是结束的地址(最后一位要排序的地址)。3)cmp是可选参数,用来指定排序的方法,当没有指定时,默认升序。即排序的区间是 [ start,end ) ,排序的方式是默认升序。这里我首先给出两种定义cmp的方法以及传入它们之后得到的结果。//首先第一种{}//然后第二种{}//首先,不带cmp参数,默认升序。

PL_hfc的博客 2256

algorithm头文件下的常用函数(sort)

sort是用来排序的函数,它根据具体情形使用不同的排序方法。 1.如何使用sort排序 sort函数的使用必须加上头文件#include<algorithm>, 使用方法如下: sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(非必填)); 可以看到,sort的参数有三个,其中前两个是必填的,而比较函数则可以根据需要填写, 如果不写比较函数,则默认对前面给出的区间进行递增排序。 int a[6]={9,4,2,5,6,-1} sort(a,a+6);//将a[0]~a[5]

m0_66484415的博客 2087

C++algorithm头文件下sort函数的使用

1. sort函数是用来排序的函数,它是根据具体的情况使用不同的排序方法,效率较高,一般来说,不推荐使用C语言中的qsort函数,原因是qsort函数使用起来比较麻烦,涉及到很多指针的操作,而且在sort函数在实现中规避了经典快速排序中可能出现的会导致实际复杂度退化到O(n ^ 2)的极端情况,所以我们在排序的时候尽量使用C++下的sort函数来进行排序 2. 下面是sort函数的常见用法: ...

二哈 1万+

【C++数据结构算法】排序sort---实用Algorithm函数详解

sort进行排序操作---十分隐蔽的使用规范!!

起床气233的博客 874

C++标准库中sort()排序函数的使用

C++STL标准库种sort()函数的使用方法,不同排序方法的实现方式!

m0_63650113的博客 1844

#include <algorithm>中sort的一般用法

1、sort函数的时间复杂度为

xiangle1993的专栏 1万+

C++_algorithm_sort()

1. sort()函数声明 参考文档 default (1) template <class RandomAccessIterator> void sort (RandomAccessIterator first, RandomAccessIterator last); custom (2) template <class RandomAccessIterator, class Compare> void sort (RandomAccessIterator fir

田一一 410
上一篇: C++ Windows窗口程序:子窗口控件之按钮类button
下一篇: 非可视化编程的windows窗口 C++ 代码设计:附例程并多多知识点
Hann Yang
Hann Yang 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域 领域专家: 算法与数据结构技术领域 领域专家: 算法与数据结构技术领域
博客等级 码龄19年 4万+粉丝 1041原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Hann Yang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值