C++ 排序算法

这篇具有很好参考价值的文章主要介绍了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);

	
}

🔍运行结果:C++ 排序算法

🙂 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;
}

🔍运行结果:

C++ 排序算法

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

🙂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);
}

🔍运行结果:

C++ 排序算法

🙂 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);
}

🔍运行结果:

C++ 排序算法

 文章来源地址https://www.toymoban.com/news/detail-465513.html

🤔结束!

到了这里,关于C++ 排序算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ 排序算法

    📖1. sort   对容器内元素进行排序   📖2. random_shuffle     洗牌  指定范围内的元素随机调整次序   📖3. merge   容器元素合并,并整合到另一个容器中   📖4 . reverse     反转指定容器元素 📖在C++语言中,sort(排序)函数是STL(标准库)中的一个函数,它用于将一个数组或

    2024年02月07日
    浏览(24)
  • 快速排序算法(C++版)

    快速排序(Quick Sort) 是一种常用的高效排序算法,属于分治法的典型代表。它的基本思想是选择一个基准元素,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有元素小于基准,另一部分的所有元素大于基准,然后对这两部分分别递归地进行排序。因为

    2024年02月05日
    浏览(75)
  • C++算法之快速排序

    我们知道,给一个长度为n的序列排序,有三种很简单的算法:选择排序、冒泡排序、插入排序。这三种算法的复杂度均为 O(n^2) 。 如果按照计算机 1 秒钟可以进行 10^8 次计算作为参照,那么它1秒之内可以排序的序列长度大概为 10^4 这个数量级。 然而,在实际生活中, 10^4 级

    2024年02月10日
    浏览(33)
  • 排序算法(九大)- C++实现

    目录 基数排序 快速排序  Hoare版本(单趟) 快速排序优化 三数取中  小区间优化 挖坑法(单趟) 前后指针法(单趟) 非递归实现(快排) 归并排序 非递归实现(归并) 计数排序 冒泡排序 插入排序 希尔排序(缩小增量排序) 选择排序(优化版本) 堆排序 实现原理:

    2024年02月13日
    浏览(43)
  • C++算法之冒泡排序

    试想一下,如果在上体育课的时候,通常学生都会随意站成一列,但是体育老师会帮忙调整学生的站位使得最终顺序是按照身高排序的。那么,回忆一下体育老师是如何调整顺序的呢? 假设体育老师想将学生从左到右按照身高从矮到高排序。通常情况下,他会从左到右扫视学

    2024年02月14日
    浏览(42)
  • 【C++】数据结构与算法:常用排序算法

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍常用排序算法。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 排序算法是计算机科学中常见的一类算法,用于将一组数据按照特定的顺序进行排

    2024年02月14日
    浏览(49)
  • 【C++】STL 算法 - 排序算法 ( 合并排序算法 - merge 函数 | 随机排序算法 - random_shuffle 函数 | 反转序列算法 - reverse 函数 )

    在 C++ 语言 的 标准模板库 ( STL , STL Standard Template Library ) 中 , 提供了 merge 合并排序算法函数 用于 将 两个已排序好的容器 合并成一个新的已排序的容器 ; merge 合并排序算法 函数原型 如下 : 参数解析 : InputIterator1 first1 参数 : 有序 输入 容器 1 的 迭代器范围 的 起始迭代器 (

    2024年01月18日
    浏览(52)
  • 【C++】 排序算法合集 && 单元测试

    排序算法 是《数据结构与算法》中最基本的算法之一。 十种常见排序算法可以分为两大类: 比较类排序 :通过比较来决定元素间的相对次序,时间复杂度为 O(nlogn)~O(n²)。 非比较类排序 :不通过比较来决定元素间的相对次序,其时间复杂度可以突破 O(nlogn),以线性时间运

    2024年03月15日
    浏览(45)
  • 【数据结构与算法C++实现】3、排序算法

    原视频为左程云的B站教学 外层循环 :n个数需要冒n-1个泡上去,剩下的一个必然是最小的。所以外层循环执行n-1轮 内层循环 :比大小,第1个泡需要比n-1次,第2个泡,比较n-2次… 选择: 每次从待排序序列中选择 最小的一个 放在已排序序列的后一个位置 原理类似于对扑克牌

    2024年02月11日
    浏览(58)
  • c++排序算法——冒泡排序(不会的一定要看,超级详细)

    今天,我们来学习一种排序算法—— 冒泡排序 。 首先,先问三个问题: 想象一下,如果字典不是按照字母顺序排列,查找一个单词,你得查到什么时候?这就是为什么人们引入了分类的概念,因为其 极大地帮助我们快速搜索物品 。 或者说,排序是一种常用的整理信息的方

    2024年02月16日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包