C++ 排序算法

news2024/12/26 12:06:44

🤔排序算法:

📖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://www.coloradmin.cn/o/591525.html

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

相关文章

强推宝藏网站

最近还是有很强烈的感受&#xff0c;方法大于努力。最近就整理了一下大学期间比较好用的网站&#xff0c;也陪我度过了一段时间了&#xff0c;排名不分先后&#xff0c;把压箱底的东西拿出来了。 ChatGPT WeTab 新标签页https://www.wetab.link/ChatGPT国内免费使用方法有哪些…

【数据结构6】二叉树的基本操作

文章目录 ⭐️写在前面的话⭐️二叉树的一些基本操作1、结构定义2、先序创建这棵树3、按满二叉树方式创建4、三种递归遍历5、层次遍历6、求二叉树的深度7、求叶子结点数8、三种非递归遍历9、先序线索化二叉树10、先序线索化后遍历11、中序线索化二叉树12、中序线索化后遍历主函…

MySQL进阶- SQL优化和视图

目录 SQL优化插入数据时的SQL优化&#xff08;insert优化&#xff0c;和大批量数据插入&#xff09;主键优化order by优化&#xff08;排序操作的优化&#xff09;group by优化&#xff08;分组优化&#xff09;limit优化&#xff08;分页查询优化&#xff09; SQL优化 插入数…

[RUST/腐蚀]Windows-开服服务端下载以及配置

一、前置要求 1.SteamCMD&#xff1a;SteamCMD - Valve Developer Communityhttps://developer.valvesoftware.com/wiki/SteamCMD 2.通过SteamCMD下载RUST/腐蚀服务端。 二、SteamCMD 注意&#xff1a;所有目录均应避免出现中文。 1.建立SteamCMD文件夹&#xff0c;如 D:\st…

准备入门python的一些建议

提醒&#xff1a;一下内容只代表个人观点 从18年左右开始&#xff0c;python的广告就被打得满天飞&#xff0c;网上各种吹嘘python这门语言的广告五花八门&#xff0c;当然也有一些人看完这些广告后感觉python非常的高大上&#xff0c;然后就入门学习了python&#xff0c;我就…

【测试基础02】

测试基础02 一、HTML基础二、Python导入三方模块三、安装webgrock驱动四、元素定位(1)、元素定位工具(2)、元素定位方式(3)、XPATH路径(3)、CSS选择器 五、Selenium WebDriver初步应用(1)、基本方法(2)、测试案例1(3)、测试案例2(3)、测试案例3 六、获取元素信息的方法七、fram…

价值5000元以上的某马大数据全套视频【强烈推荐】

某马大数据 01、阶段一 Python大数据开发基础 01、第一章大数据介绍及开发环境 02、第二章 linux命令 03、第三章 MySQL数据库 04、第四章 excel的使用 05、第五章 kettle的使用 06、第六章 数据分析及可视化 07、第七章 大数据框架与数仓基础 08、第八章 数仓实战项目 …

3-网络初识——协议

目录 1.概念 ①语法&#xff1a;即数据与控制信息的结构或格式。 ②语义&#xff1a;即需要发出何种控制信息&#xff0c;完成何种动作以及做出何种响应。 ③时序&#xff1a;即事件实现顺序的详细说明。 2.作用 3.知名协议的默认端口 4.协议分层 4.1.什么是协议分层 …

chatgpt赋能python:Python中的转置操作:理解与实践

Python中的转置操作&#xff1a;理解与实践 在Python中&#xff0c;可以使用转置操作来将矩阵或数组的行和列交换位置。转置操作不仅在数学和统计学上有广泛应用&#xff0c;也在机器学习和数据分析领域中非常重要。在本文中&#xff0c;我们将深入探讨Python中的转置操作的基…

C# | 使用Memory<T>高效地读写内存数据

C# | 使用Memory高效地读写内存数据 文章目录 C# | 使用Memory<T>高效地读写内存数据前言Memory<T>介绍示例结束语 前言 Memory<T>是C# 7.2版本中引入的一种新类型&#xff0c;可以更加高效地读写内存数据。本文将介绍它的用途以及如何使用它来优化代码。 P…

机器视觉康耐视智能相机Insight-手眼标定详细步骤

(Q有答疑)康耐视VisionPro工具与脚本入门级系列教程2023 In-Sight 智能相机包含标定手眼的工具 CalibrateGrid,用手动的标定方式,即将康耐视标定片固定在运动平台上,然后手动输入电机位置坐标,要保证电机在 X 方向移动一次,Y 方向移动一次,旋转两次角度,切旋转角度差不能…

chatgpt赋能python:Python中的绝对值函数

Python中的绝对值函数 在Python编程语言中&#xff0c;绝对值函数是一个非常重要和常用的函数。它可以帮助我们快速地计算一个数的绝对值&#xff0c;而不需要手动使用if语句来处理。在本文中&#xff0c;我们将介绍Python中的绝对值函数&#xff0c;并且讨论它的一些应用。 …

Linux 上安装 PostgreSQL——Ubuntu

打开 PostgreSQL 官网 PostgreSQL: The worlds most advanced open source database&#xff0c;点击菜单栏上的 Download &#xff0c;可以看到这里包含了很多平台的安装包&#xff0c;包括 Linux、Windows、Mac OS等 。 Linux 我们可以看到支持 Ubuntu 和 Red Hat 等各个平台…

ARC学习(1)基本编程模型认识

笔者有幸接触了arc处理器&#xff0c;今天就来简单了解一下arc的编程模型 1、ARC基本认识 ARC IP是synopsys 新思公司开发的一个系列ARC IP核&#xff0c;其是一家电子设计自动化&#xff08;EDA&#xff09;解决方案提供商。其主页地址在这里&#xff01;业务主要如下&#x…

chatgpt赋能python:Python中的按位取反

Python中的按位取反 Python中的按位取反是一种常见的操作&#xff0c;它可以让我们快速地对二进制的数字进行取反操作。在本文中&#xff0c;我们将介绍Python中的按位取反操作&#xff0c;并探讨它的用途和示例。 什么是按位取反 按位取反是一种将二进制数中的每一位进行反…

Vue之前后端交互模式

1. fetch-API的使用 1.1 init <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"…

手机常识汇总

目录 一、手机历史介绍 第一代模拟制式手机(1G) 什么是模拟网? 模拟网络与数字网络的区别 数字通信与模拟通信相比具有明显的优点: 第二代数字手机(2G) 什么是“GSM” 什么是 “CDMA”? GSM 数字机和模拟手机话音相比 什么是“GSM/CDMA 双模机”? 什么是“TDMA”…

FinChat.io,金融领域的chatgpt

投资股票是一个充满挑战的过程,随着市场的起起伏伏,要抓住每一个机会,同时规避各种风险,这需要投资者具有敏锐的洞察力和快速的决策能力。不过现在有好消息,一款人工智能聊天机器人 FinChat.io 诞生了!它能帮助投资者分析市场,挖掘有潜力的股票,并提供买卖的实时建议 --------…

Java与数据库:JDBC和ORM框架的使用和效率优化

第一章&#xff1a;引言 随着互联网的快速发展和大数据时代的到来&#xff0c;数据库在软件开发中起到了至关重要的作用。Java作为一门强大而广泛应用的编程语言&#xff0c;提供了多种与数据库交互的方式。其中&#xff0c;JDBC和ORM框架是最常用的两种方式。本文将深入探讨J…

OpenWRT 实现Exsi8单个公网ip管理与访问

一台Dell R720机器 内存256G(64G*4)硬盘SSD 8T(1T*8)搭建了一个裸金属k8s集群(对比阿里云单台4核8G的费用不相上下) 机房上架提供了一个公网ip 需要一个公网ip能实现exsi虚拟机管理 又可以让虚拟机实现web访问 是终通过OpenWRT实现 OpenWRT实现步骤 1、官网访问并下载img镜…