C++ 排序算法

🤔排序算法:

📖1.sort   对容器内元素进行排序
 
📖2.random_shuffle    洗牌  指定范围内的元素随机调整次序
 
📖3.merge   容器元素合并,并整合到另一个容器中
 
📖4.reverse    反转指定容器元素

🤔逐一介绍:

🙂1.sort    排序

📖在C++语言中,sort(排序)函数是STL(标准库)中的一个函数,它用于将一个数组或vector等STL容器中的元素进行排序。sort函数可以将元素以升序或降序的方式排序。sort函数的使用需要包含头文件<algorithm>。

void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);

📖sort函数可以接受三个参数,第一个参数是排序的数组或STL容器的首地址,第二个参数是指定排序数据的大小,通常可以使用sizeof运算符来计算,第三个参数是一个函数指针,用于指定排序的规则,默认情况下,sort函数按照升序进行排序,而我们可以通过在第三个函数位引入不同的规则函数来确定排序条件。

📖第三个参数可以用我们之前介绍的关系仿函数代替,下面这个链接中介绍了仿函数

C++ 函数对象 详解_我是一盘牛肉的博客-CSDN博客

🔍代码示例:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void print(vector<int>d)
{for (auto a = d.begin(); a != d.end(); a++){cout << *a<<"  ";}cout << endl;
}
int main()
{vector<int>d1;d1.push_back(20);d1.push_back(23);d1.push_back(10);d1.push_back(22);d1.push_back(34);d1.push_back(28);cout << "反转前";print(d1);cout << "反转后";sort(d1.begin(), d1.end(), less<int>());print(d1);}

🔍运行结果:

🙂 2.random_shuffle  随机排序

📖在C++中,random_shuffle 是STL提供的一个函数,用于对一个序列或容器中的元素进行乱序排列,即将其中的元素随机打乱。它头文件为<algorithm>。

📖random_shuffle 函数不需要我们自己编写乱序算法,只需要将待打乱的序列或容器的首地址和尾地址传入函数即可。它的函数原型如下:

template <class RandomAccessIterator>
void random_shuffle(RandomAccessIterator first, RandomAccessIterator last);

📖其中,firstlast分别为待打乱的序列(或容器)的首尾元素的迭代器。

📖需要注意的是它也是伪随机,需要利用时间戳改变随机规则。

include<ctime>
strand((unsigned int)time(NULL));

关于时间戳的介绍,我们放在了这篇文章里:

C语言 rand函数_我是一盘牛肉的博客-CSDN博客

我们这里利用随机排序的特点实现一个比较好玩的排序:猴子排序

猴子排序(也常被称为猴子补丁或瞎子排序)是一种思路简单但并不实用的乱序算法。它没有太大的用处,仅仅作为一种娱乐性质的算法而被提及。

猴子排序的思路是,根据“猴子定理”来猜测正确的排序位置。该定理指出,如果无限次地随机打乱一个序列,那么该序列最终也会被排成有序列。

具体来说,猴子排序的流程如下 :

1. 随机打乱待排序的序列。
2. 判断序列是否已经排好序,如果是,算法结束;否则,继续第3步。
3. 再次随机打乱序列并回到第2步。

需要注意的是,猴子排序的时间复杂度是非常高的,尤其是在待排序的序列长度较长的情况下,它的时间复杂度接近于无穷大,因此在实际应用中不宜使用。

🔍代码运行:

#include <iostream>
#include <algorithm>
#include <vector>using namespace std;void print(vector<int> d)
{for (auto a = d.begin(); a != d.end(); a++){cout << *a << "  ";}cout << endl;
}bool operator==(vector<int> d1, vector<int> d2)
{auto a1 = d1.begin();auto a2 = d2.begin();int count = 0;int size = d1.size();while (a1 != d1.end()){if (*a1 != *a2){return false;}a1++;a2++;count++;}return count == size;
}int main()
{vector<int> d1;d1.push_back(20);d1.push_back(23);d1.push_back(10);d1.push_back(22);d1.push_back(34);d1.push_back(28);vector<int> d2;d2 = d1;sort(d2.begin(), d2.end());for (int i = 0; i < 1000; i++){random_shuffle(d1.begin(), d1.end());print(d1);if (d1 == d2){print(d1);return 0;}}return 0;
}

🔍运行结果:

我们通过不断的随机排序最终找到了符合要求的排序。

🙂3.merge  合并排序

📖在 C++ 的 STL 库中,merge 是一个用于让两个已经排好序的数组合并成一个有序数组的算法,它支持常规数组和 STL 容器。

📖merge 的函数原型为:

template<class InputIt1, class InputIt2, class OutputIt>
OutputIt merge(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, OutputIt d_first);

📖其中,参数 first1 和 last1 是第一个已排序区间的首迭代器和尾部后继迭代器,first2 和 last2 是第二个已排序区间的首迭代器和尾部后继迭代器,d_first 是新的有序序列起始位置的迭代器。

📖merge() 函数从两个已排序序列中取出较小的值并放入目标序列中,直到其中一个序列已经没有元素为止。如果两个序列中有相等的元素,则将第一个序列的元素放在前面。最后,merge() 返回值为新序列的最后一个后置迭代器。

🔍代码示例:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void ptint(int val)
{cout << val<<" ";
}
int main()
{vector<int>d1;for (int i = 0; i < 10; i++){d1.push_back(i);}vector<int>d2;for (int i = 0; i < 10; i++){d2.push_back(i);}cout << "合并前" << endl;cout << "d1   ";for_each(d1.begin(), d1.end(), ptint);cout << endl;cout << "d2   ";for_each(d2.begin(), d2.end(), ptint);vector<int>d3;//创建自定义变量并不会自动分配内存,需要我们自己主动分配d3.resize(20);cout << endl;cout << "合并到d3后";merge(d1.begin(), d1.end(), d2.begin(), d2.end(), d3.begin());for_each(d3.begin(), d3.end(), ptint);
}

🔍运行结果:

🙂 4.reverse  反转排序

📖在 C++ STL 中,reverse()是一种简单且常用的算法,用于将数组或容器中所有元素顺序颠倒,即实现序列的翻转。

📖reverse()的函数原型为:

template<class BidirIt>
void reverse(BidirIt first, BidirIt last);

📖 其中,first 和 last 分别表示需要翻转的区间的首迭代器和尾部后继迭代器。

      reverse进行的是原地反转,不需要占用多余的空间。

🔍代码示例:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void ptint(int val)
{cout << val<<" ";
}
int main()
{vector<int>d1;for (int i = 0; i < 10; i++){d1.push_back(i);}vector<int>d2;for (int i = 0; i < 10; i++){d2.push_back(i);}cout << "合并前" << endl;cout << "d1   ";for_each(d1.begin(), d1.end(), ptint);cout << endl;cout << "d2   ";for_each(d2.begin(), d2.end(), ptint);vector<int>d3;//创建自定义变量并不会自动分配内存,需要我们自己主动分配d3.resize(20);cout << endl;cout << "合并到d3后";merge(d1.begin(), d1.end(), d2.begin(), d2.end(), d3.begin());for_each(d3.begin(), d3.end(), ptint);
}

🔍运行结果:

 

🤔结束!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/253160.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

JavaEE HTTPS加密原理

HTTPS加密原理✿✿ヽ(▽)ノ✿ 文章目录 JavaEE & HTTPS加密原理1. 为什么要加密2. HTTPS加密原理2.1 初始想法2.2 引入非对称加密2.3 中间人攻击2.4 引入证书 JavaEE & HTTPS加密原理 1. 为什么要加密 例子&#xff1a;&#xff08;运营商劫持&#xff09; 你可能经常…

骁龙888和麒麟9000哪个好 骁龙888和麒麟9000有什么区别

麒麟9000采用台积电5nm工艺&#xff0c;8核CPU设计&#xff0c;1个A77超大核3.31GHz&#xff0c;3个A77大核2.54GHz&#xff0c;4个A55小核2.05GHz&#xff0c;GPU采用24核Mali-G78&#xff0c;AI部分是双大核 NPU 微核 NPU 我的手机就是活动时8折抢购的 点击开抢 http://shou…

EclipseCDT远程交叉编译远程单步调试基于makefile例程(实测有效)

文章目录 前言&#xff1a;1. 新建工程2. 远程编译环境配置2.1 下载sshfs并挂载目录2.2 Debug配置2.3安装EclipseCDT的远程插件2.4 拷贝gdbserver 3. 调试总结: 前言&#xff1a; 之前写过一篇VSCode远程调试linux&#xff0c;当时是把程序以及代码通过远程的方式&#xff0c;…

骁龙780G和麒麟980哪个好

骁龙780G&#xff1a;采用了6nm的制作工艺 麒麟980采用的是7nm的工艺制作。 我用的手机就是活动时7.5折抢购的 点击开抢 http://shouji.adiannao.cn/7 骁龙780G&#xff1a;“116”的八核架构&#xff0c;1Cortex A76 2.6GHz 1Cortex A76 2.4GHz 6*Cortex A55 2.0GHz。GPU型号…

甜品网站界面

最开始就是logo部分和导航栏部分 logo部分就是用的div里面写img然后给浮动就可以了 第二个是导航栏部分 用的也是无序标签 代码如下&#xff1a; 轮播图部分 没做出来效果 甜蜜约会品牌简介 红色框框以外的我用的是 div img 和 p标签做的 这些很简单 就不展示代码了 红色边…

maccmsv10 苹果cms 深度定制站群版

熊猫站群系统苹果MacCmsV10 熊猫电影站群系统苹果MacCmsV10是一款专门为每个做站群的独行侠量身打造的省时省力省心的电影站群系统。 作为站群的重度使用者&#xff0c;深知作站痛点。从站长角度出发&#xff0c;解决痛点。非侵入式开发,基于Thinkphp框架&#xff0c;兼容苹果M…

苹果CMS采集工具

苹果CMS采集&#xff0c;是苹果CMS影视站必不可少的功能。现在很多站长想做一个自己的影视站点&#xff0c;感觉影视站点的流量很大&#xff0c;关键词多&#xff0c;做起来会非常容易&#xff0c;的确是这样。这篇文章主要是给大家分享一下关于影视站以及苹果CMS采集的&#x…

苹果c语言怎么用windows。h_苹果12怎么用蓝牙传照片?iphone12无线传相片的详细步骤...

阅读本文前,请您先点击上面的“蓝色字体”,再点击“关注”,这样您就可以继续免费收到文章了。每天都会有分享,都是免费订阅,请您放心关注。注图文来源网络,侵删 …

苹果CMS火车头采集发布模块教程

苹果CMS火车头采集教程苹果CMS发布模块&#xff0c;苹果CMS怎么自动采集&#xff1f;苹果CMS怎么自动发布。今天给大家分享一款免费的苹果CMS自动采集发布工具&#xff0c;支持指定网站数据采集&#xff0c;支持关键词内容采集。详细参考图片教程 百度最近更新得比拟多&#xf…

android 双卡 默认流量 卡,双卡双待功能怎么用?如何设置默认流量卡?

原标题&#xff1a;双卡双待功能怎么用&#xff1f;如何设置默认流量卡? 了解双 SIM 卡状态图标 屏幕顶部状态栏中的图标能够显示两个运营商的信号强度&#xff0c;在「控制中心」可以显示更详细的 SIM 卡状态。 设置默认号码 将「主卡」作为默认号码&#xff1a;勾选此方案后…

苹果手机更改照片大小kb,苹果手机怎么把图片缩小 怎么用手机把图片缩小

关于如何使用手机把图片缩小到自己需要的大小体积?这是一个比较有含量的技术活了&#xff0c;在不借助任何软件的辅助下&#xff0c;苹果手机就可以做到这一点&#xff0c;具体的操作方法请和小编一起来看看吧。 苹果手机怎么把图片缩小 怎么用手机把图片缩小 首先打开苹果手机…

苹果CMS采集方法支持文章资源采集

苹果cms采集视频可以在后台联盟资源库里直接设置采集&#xff0c;也可以自己配置自定义采集库&#xff0c;而关于文章资讯采集&#xff0c;苹果cms后台并没有配备专门的采集库&#xff0c;所以文章采集我们需要自己去添加采集接口&#xff0c;或者是使用第三方的采集工具&#…

苹果采集插件全套教程-苹果cmsV10采集插件

最近几年随着互联网时代的发展&#xff0c;做电影网站的站长越来越多了&#xff0c;加入此行列的人也是与日俱增&#xff01;但是很多站长都是跟风来做电影站的&#xff0c;怎么做一点思路都没有。电影资源都不知道怎么来的。今天就教大家怎么做好电影站&#xff0c;文章有点长…

苹果自带的APP下载分析统计工具

对于APP运营的工作人员&#xff0c;查看APP的下载量和访问量是非常重要的。当然&#xff0c;我们开发人员有时候也会想看看自己开发的APP有多少人在使用&#xff0c;但是苹果开发者官网一直没有提供这个功能&#xff0c;一些第三方的网站&#xff0c;比如蒲公英、友盟等提供了这…

android流量定位吗,安卓消耗流量比iPhone多?揭密真相:意外

“手机充电3小时,耗流量23GB”,“武汉一女子,一夜间用掉流量53.3GB”…… 不少网友称,最近他们的流量消耗快得惊人。是手机的问题?是软件的问题?还是运营商的问题?钱江晚报联合省质监局,对多品牌手机、多种网络信号源进行较严谨的流量试验,试图弄明白几个问题: 1、关…

苹果怎样用小米云服务器,苹果换华为/小米,怎么同步数据?教程来了!

原标题&#xff1a;苹果换华为/小米&#xff0c;怎么同步数据&#xff1f;教程来了&#xff01; 由于系统不同&#xff0c;iOS和Android之间数据迁移一直都是跨平台换机用户的“绊脚石”。而且iOS是封闭系统&#xff0c;不像Android那么开源。 尽管市面上的App基本都支持两大系…

苹果CMS插件-苹果CMS必备插件

苹果CMS插件是指针对苹果CMS网站开发的插件&#xff0c;在已经熟悉了解的苹果CMS的情况下&#xff0c;结合插件以及seo手法制定出适合这个网站的优化方法。随着近几年影视产业的快速发展&#xff0c;电影网站也成为从事互联网工作者们饱受关注的网站之一。&#xff0c;由原先的…

苹果CMS插件安装使用下载苹果CMS插件集合

其实博主做SEO已经十二年了&#xff0c;一直都是通过深入研究搜索引擎的各种核心算法&#xff0c;来帮助大家网站快速收录从而达到关键词排名。所以对于网站SEO优化掌握的技术也算是精通各种手法。毕竟这十几年来也踩过一些坑&#xff0c;所以还是有一些经验可以跟大家分享下&a…

证件照怎么自己P图?证件照拍照攻略 记得收藏

很多同学都表示自己的证件照太丑&#xff0c;皮肤瑕疵、身材臃肿、表情狰狞、眼神呆滞......但你知道嘛&#xff1f;现在证件照也可以自己在家P图啦&#xff01;市面上有一种证件照工具&#xff0c;叫做证件照生成器&#xff0c;既有着美颜、换装、换底色等功能&#xff1b;又有…

ps制作计算机考试证件照,如何通过PS制作一寸证件照(超详细流程)?

一寸证件照的用途很广泛&#xff0c;比如我们在毕业证书上、求职简历上等都需要提供&#xff0c;多数人可能会选择去打印店花钱制作&#xff0c;但是这样下来既浪费钱又花费时间&#xff0c;如果你的电脑里安装了Photoshop软件&#xff0c;那么何不自己动手做一个呢&#xff1f…