第九章(13):STL之常用排序算法

news/2025/2/13 6:19:38/

文章目录

  • 前情回顾
  • 常用排序算法
    • sort
    • random_shuffle
    • merge
    • reverse
  • 下一座石碑

🎉welcome🎉
✒️博主介绍:一名大一的智能制造专业学生,在学习C/C++的路上会越走越远,后面不定期更新有关C/C++语法,数据结构,算法,Linux,ue5使用,制作游戏的心得,和大家一起共同成长。
✈️C++专栏:C++爬塔日记
😘博客制作不易,👍点赞+⭐收藏+➕关注

前情回顾

在上一块石碑中,我学到了,同时下一块石碑也显露出来…

  • 🚄上章地址:第九层(12):STL之常用查找算法

常用排序算法

  • 常用的排序算法有有四种
sort//排序算法,对容器内的元素进行排序
random_shuffle//对于指定范围内的元素进行随机打乱
merge//将两个元素合并放到另一个容器当中
reverse//反转指定区间内的元素

sort

  • sort是最常用的排序算法,它可以排序任何类型,对于内置类型可以直接排序,对于自定义类型要指定规则,可以利用仿函数或者函数(两者都必须是谓词),也可以利用谓词去改变排序规则,sort的默认规则是从小到大
sort(beg,end,_pred)
  • beg是要排序区间的开始迭代器,end为结束迭代器,_pred为谓词,可以写,也可以不写,默认从小到大进行排序

使用:

#include<iostream>
using namespace std;
#include<algorithm>bool _sort(int a, int b)
{return a > b;
}
void test1()
{int arr[10] = { 0,5,3,4,6,9,2,1,7,8 };cout << "排序前:" << endl;for (int i = 0; i < sizeof(arr) / sizeof(int); i++){cout << arr[i] << " ";}cout << endl;sort(arr, arr+sizeof(arr)/sizeof(int));cout << "排序后:" << endl;for (int i = 0; i < sizeof(arr) / sizeof(int); i++){cout << arr[i] << " ";}cout << endl;sort(arr, arr + sizeof(arr) / sizeof(int),_sort);cout << "升序排序后:" << endl;for (int i = 0; i < sizeof(arr) / sizeof(int); i++){cout << arr[i] << " ";}cout << endl;
}
int main()
{test1();return 0;
}

在这里插入图片描述

random_shuffle

  • random_shuffle可以去打乱指定范围内的元素,随机打乱,但是又缺点,就和rand一样,它的随机不是完全随机的,在程序第一次运行起来,这个随机就定下来了,所以想让random_shuffle真正随机起来,需要借助时间戳和srand
random_shuffle(beg,end);
  • beg是要打乱区间的开始迭代器,end为结束迭代器

使用:

#include<iostream>
using namespace std;
#include<algorithm>
#include<ctime>void test1()
{srand((unsigned int)time(NULL));int arr[10] = { 0,5,3,4,6,9,2,1,7,8 };cout << "打乱前:" << endl;for (int i = 0; i < sizeof(arr) / sizeof(int); i++){cout << arr[i] << " ";}cout << endl;random_shuffle(arr, arr + sizeof(arr) / sizeof(int));cout << "打乱后:" << endl;for (int i = 0; i < sizeof(arr) / sizeof(int); i++){cout << arr[i] << " ";}cout << endl;
}
int main()
{test1();return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

merge

  • merge的主要作用是合并两个容器,成为一个新的容器,这里要注意,容器内元素必须有序,而且在给新容器放元素之前,要提前开辟好空间并且空间要足够大
merge(beg1,end1,beg2,end2.dest);
  • beg1是容器1的开始迭代器,end1为容器1的结束迭代器,beg2为容器2的开始迭代器,end2是容器2的结束迭代器,dest为存放容器的开始迭代器

使用:

#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>void print(vector<int>& a)
{for (auto b = a.begin(); b < a.end(); b++){cout << *b << " ";}cout << endl;
}
void test1()
{vector<int> a, b;for (int i = 0; i < 10; i++){a.push_back(i);b.push_back(i + 1);}print(a);print(b);vector<int> c;c.resize(a.size() + b.size());merge(a.begin(), a.end(), b.begin(), b.end(), c.begin());print(c);
}
int main()
{test1();return 0;
}

在这里插入图片描述

  • 可以发现是直接排序好的,可以用于归并排序归并部分

reverse

  • reverse的作用是逆序容器内的元素
reverse(beg,end);
  • beg是要逆序区间的开始迭代器,end为结束迭代器

使用:

#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>void print(vector<int>& a)
{for (auto b = a.begin(); b < a.end(); b++){cout << *b << " ";}cout << endl;
}
void test1()
{vector<int> a;for (int i = 0; i < 10; i++){a.push_back(i);}cout << "逆序前" << endl;print(a);reverse(a.begin(), a.end());cout << "逆序后" << endl;print(a);
}
int main()
{test1();return 0;
}

在这里插入图片描述

下一座石碑

  • 这座石碑倒下了,露出了下一座石碑…

😘预知后事如何,关注新专栏,和我一起征服C++这座巨塔
🚀专栏:C++爬塔日记
🙉都看到这里了,留下你们的👍点赞+⭐收藏+📋评论吧🙉


http://www.ppmy.cn/news/22293.html

相关文章

OpenCV 图像形态学处理

本文是OpenCV图像视觉入门之路的第11篇文章&#xff0c;本文详细的在图像形态学进行了图像处理&#xff0c;例如&#xff1a;腐蚀操作、膨胀操作、开闭运算、梯度运算、Top Hat Black Hat运算等操作。 OpenCV 图像形态学处理目录 1 腐蚀操作 2 膨胀操作 3 开闭运算 4 梯度运…

【博客608】源ip是本地网卡ip的流量都发往lo网卡的原因剖析

源ip是本地网卡ip的流量都发往lo网卡的原因剖析 场景&#xff1a;本地ip之间通信&#xff0c;流量都会发现lo&#xff0c;不会发往本地ip所在device example&#xff1a; ubuntu10.200.60.4:~$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNK…

CQF项目课程学习介绍(三)—— 高级选修课

✏️写作&#xff1a;个人博客&#xff0c;InfoQ&#xff0c;掘金&#xff0c;知乎&#xff0c;CSDN &#x1f4e7;公众号&#xff1a;进击的Matrix &#x1f6ab;特别声明&#xff1a;原创不易&#xff0c;未经授权不得转载或抄袭&#xff0c;如需转载可联系小编授权。 概述 …

【算法基础】高精度减法

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前是C语言学习者 ✈️专栏&#xff1a;【C/C】算法 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞…

ESP-IDF:模板函数测试

模板函数测试 template //告诉编译器下面使用函数模板T,仅仅对下面这个函数有效 void swap22(T &a, T &b) { T temp a; a b; b temp; } void test22() { cout<<“--------模板函数测试--------”<<endl; int a 2; int b 9; cout<<“before sw…

索命一问:一个SQL ,怎么分析加了哪些锁?

背景说明&#xff1a; 美团问数据库应该是非常多的&#xff0c;尤其喜欢考手写 SQL 然后问你这个 SQL 语句上面加了哪些锁&#xff0c; 你会发现其他厂面试基本很少会这样考&#xff0c;所以很多小伙伴遇到这种问题的时候都是一脸懵逼&#xff0c; 可以说是“夺命一问” 此…

STM32 GPS模块输出控制实现

本文是对 ATGM336H-5N GNSS模块的发送功能实现&#xff0c;已经验证过功能&#xff0c;供大家参考 配置的目标&#xff1a; 只使用北斗定位&#xff1b;只接收RMC类型的数据帧 说明&#xff1a; 使用芯片为 STMF103C8T6芯片使用芯片为了 杭州中科微电子有限公司 的因此发送…

IDEA + SpringBoot 本地热部署

IDEA SpringBoot 本地热部署1.spring-boot-devtools快速重启动2.配置IDEA自动重启1.spring-boot-devtools快速重启动 spring-boot-devtools 是 Spring Boot 提供的开发者工具&#xff0c;它会监控当前应用所在的 classpath 下的文件发生变化&#xff0c;进行自动重启。 sprin…