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

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

算法(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

20210221140335465.gif


Insertion Sort

20210221140441421.gif


Selection Sort

20210221140543873.gif


Quick Sort

2021022114073917.gif



Merge Sort

20210221140638535.gif

目录
相关文章
|
2月前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
146 67
|
8天前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
6天前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
13天前
|
算法 安全 C++
用 C++ 算法控制员工上网的软件,关键逻辑是啥?来深度解读下
在企业信息化管理中,控制员工上网的软件成为保障网络秩序与提升办公效率的关键工具。该软件基于C++语言,融合红黑树、令牌桶和滑动窗口等算法,实现网址精准过滤、流量均衡分配及异常连接监测。通过高效的数据结构与算法设计,确保企业网络资源优化配置与安全防护升级,同时尊重员工权益,助力企业数字化发展。
35 4
|
3月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
3月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
110 6
|
3月前
|
存储 算法 C++
高精度算法(加、减、乘、除,使用c++实现)
高精度算法(加、减、乘、除,使用c++实现)
820 0
高精度算法(加、减、乘、除,使用c++实现)
|
3月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
51 0
|
3月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
54 0
|
2天前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。