C++ STL(18):排序算法

【C++21天养成计划】STL算法超全整理!(Day18) 横扫STL算法,帅翻全场! 阅读详情
#include <iostream>
#include <algorithm>
#include <functional> //for greater
#include <iterator>
#include <vector>
#include <math.h>
#include <assert.h>
 
class Job
{
public:
     enum Priority_code{ standard, normal, high };
     Job(int i, Priority_code pc = standard)
              : id(i), pri(pc){ }
     
     Priority_code getPri() const { return pri; }
     int getId() const { return id; }
 
     friend std::ostream& operator<<(std::ostream& os, const Job& job)
     {
          os << job.getId() << "(" << job.getPri() << ")";
          return os;
     }
 
     friend bool operator<(const Job& job1, const Job& job2)
     {
          return job1.getPri() > job2.getPri();
     }
 
public:
     Priority_code pri;
     int id;
};
 
//排序算法
int main()
{
     /************************************************************************/
     //sort
     /************************************************************************/
     /*
          sort:以非递减的顺序进行排序,
          sort是个不稳定的排序算法,假设[first,last)中存在两个相等的元素,sort排完序之后不能保证这两个元素的相对位置还和原来一样
          版本1:使用operator<来比较,必导致is_sorted(first,last)为true
          版本2:采用function object comp来比较,必导致is_sorted(first,last,comp)为true
     */
     /*
     template<class RandomAccessIterator>
     void sort(
          RandomAccessIterator _First,
          RandomAccessIterator _Last
          );
     template<class RandomAccessIterator, class Pr>
     void sort(
          RandomAccessIterator _First,
          RandomAccessIterator _Last,
          BinaryPredicate _Comp
      );
     */
     int A[] = { 1, 4, 8, 2, 6, 5, 7 };
     std::sort(std::begin(A), std::end(A));
     assert(std::is_sorted(std::begin(A), std::end(A)));
     //1 2 4 5 6 7 8
     std::for_each(std::begin(A), std::end(A), [](const int i){std::cout << i << " "; });
     std::cout << std::endl;
 
     int B[] = { 1, 4, 8, 2, 6, 5, 7 };
     std::sort(std::begin(B), std::end(B), std::greater<int>());
     assert(std::is_sorted(std::begin(B), std::end(B), std::greater<int>()));
     //8 7 6 5 4 2 1
     std::for_each(std::begin(B), std::end(B), [](const int i){std::cout << i << " "; });
     std::cout << std::endl;
 
     int C[] = { 1, -4, 8, -2, -6, 5, 7 };
     std::sort(std::begin(C), std::end(C),[](const int v1, const int v2)
     {
          return abs(v1) > abs(v2);
     });
     //8 7 -6 5 -4 -2 1
     std::for_each(std::begin(C), std::end(C), [](const int i){std::cout << i << " "; });
     std::cout << std::endl;

     /************************************************************************/
     //stable_sort
     /************************************************************************/
     //stable_sort:与sort类似,但是stable_sort是个稳定的排序算法,即能保证两个相等的元素在排完序之后相对位置保持不变
     /*
     template<class BidirectionalIterator>
     void stable_sort(
          BidirectionalIterator _First,
          BidirectionalIterator _Last
      );
     template<class BidirectionalIterator, class BinaryPredicate>
     void stable_sort(
          BidirectionalIterator _First,
          BidirectionalIterator _Last,
          BinaryPredicate _Comp
      );
     */
     char s[] = "fdBeACFDbEac";
     std::stable_sort(s, s + 12,[](const char c1, const char c2)
     {
          return tolower(c1) < tolower(c2);
     });
     std::cout << s << std::endl; //AaBbCcdDeEfF
     std::cout << "==============================" << std::endl;
 
     std::vector<Job> jobs;
     jobs.push_back(Job(1, Job::normal));
     jobs.push_back(Job(2, Job::standard));
     jobs.push_back(Job(3, Job::normal));
     jobs.push_back(Job(4, Job::high));
     jobs.push_back(Job(5));
     jobs.push_back(Job(6, Job::high));
     std::stable_sort(jobs.begin(), jobs.end());
     std::copy(jobs.begin(), jobs.end(), std::ostream_iterator<Job>(std::cout, "\n"));

     std::cout << "==============================" << std::endl;
     /************************************************************************/
     //partial_sort
     /************************************************************************/
     /*
          partial_sort:重新排列[first,last),使得[first,sortEnd)按照递增顺序排列,其余的可以不按照特定顺序排列,如果_SortEnd==_First,即不做任何的排序;如果_SortEnd==_Last,即把整个[first,last)进行排序
      */
     /*
     template<class RandomAccessIterator>
     void partial_sort(
          RandomAccessIterator _First,
          RandomAccessIterator _SortEnd,
          RandomAccessIterator _Last
      );
     template<class RandomAccessIterator, class BinaryPredicate>
     void partial_sort(
          RandomAccessIterator _First,
          RandomAccessIterator _SortEnd,
          RandomAccessIterator _Last
          BinaryPredicate _Comp
      );
     */
     //试找寻数组中前5个最小值,及A[0]~A[4]以非递减的顺序排序,其余不保证顺序
     int AA[] = { 7, 2, 6, 11, 9, 3, 12, 10, 8, 4, 1, 5 };
     int *p = std::begin(AA);
     std::advance(p, 5);
     std::partial_sort(std::begin(AA), p, std::end(AA));
     //1 2 3 4 5 11 12 10 9 8 7 6
     std::copy(std::begin(AA), std::end(AA), std::ostream_iterator<int>(std::cout, " "));
     std::cout << std::endl;
 
 
     /************************************************************************/
     //partial_sort_copy
     /************************************************************************/
     /*
          partial_sort_copy:函数会从[first1,last1)内复制N个最小元素到[first2,last2)之中,
          这里的N是last1-first1和last2-first2两者中的最小值,被复制过去的元素以递增顺序排列
      */
     /*
     template<class InputIterator, class RandomAccessIterator>
     RandomAccessIterator partial_sort_copy(
          InputIterator _First1,
          InputIterator _Last1,
          RandomAccessIterator _First2,
          RandomAccessIterator _Last2
      );
     template<class InputIterator, class RandomAccessIterator, class BinaryPredicate>
     RandomAccessIterator partial_sort_copy(
      InputIterator _First1,
          InputIterator _Last1,
          RandomAccessIterator _First2,
          RandomAccessIterator _Last2,
          BinaryPredicate _Comp
      );
     */
     //将数组BB中的前4个最小值复制到一个vector中去
     int BB[] = { 7, 2, 6, 11, 9, 3, 12, 10, 8, 4, 1, 5 };
     std::vector<int> iv(4);
     std::partial_sort_copy(std::begin(BB), std::end(BB),iv.begin(), iv.end());
     //1 2 3 4
     std::copy(iv.begin(), iv.end(), std::ostream_iterator<int>(std::cout, " "));
     std::cout << std::endl;
 
 
     /************************************************************************/
     //nth_element
     /************************************************************************/
     /*
          nth_element:函数重新排列[first,last),使得iterator _Nth所指元素与整个[first,last)排序后的同一位置的元素相同,此外,也保证了[nth,last)内的任意元素都大于[first,nth)内的任意元素,而并不保证[first,nth)与[nth,last)内的元素保持一种顺序
      */
     /*
     template<class RandomAccessIterator>
     void nth_element(
          RandomAccessIterator _First,
          RandomAccessIterator _Nth,
          RandomAccessIterator _Last
      );
     template<class RandomAccessIterator, class BinaryPredicate>
     void nth_element(
          RandomAccessIterator _First,
          RandomAccessIterator _Nth,
          RandomAccessIterator _Last,
          BinaryPredicate _Comp
      );
     */
     int CC[] = { 7, 2, 6, 11, 9, 3, 12, 10, 8, 4, 1, 5 };
     int *pp = std::begin(CC);
     std::advance(pp, 4);
     std::nth_element(std::begin(CC), pp, std::end(CC));
     //?????
     std::copy(std::begin(CC), std::end(CC), std::ostream_iterator<int>(std::cout, " "));
     std::cout << std::endl;


     /************************************************************************/
     //is_sorted
     /************************************************************************/
     //is_sorted:用来测试某个序列是否已经排好序,已排好返回true,反之返回false
     /*
     template <class ForwardIterator>
     bool is_sorted(
          ForwardIterator _First,
          ForwardIterator _Last
      );
  
     template <class ForwardIterator, class StrictWeakOrdering>
     bool is_sorted(
          ForwardIterator _First,
          ForwardIterator _Last,
          StrictWeakOrdering _Comp
      );
     */
     //略 
     return 0;
}
运算结果:
1 2 4 5 6 7 8
8 7 6 5 4 2 1
8 7 -6 5 -4 -2 1
AaBbCcdDeEfF
===========================
4(2)
6(2)
1(1)
3(1)
2(0)
5(0)
===========================
1 2 3 4 5 11 12 10 9 8 7 6
1 2 3 4
1 2 3 4 5 6 7 8 9 10 11 12 

====================打个广告,欢迎关注====================

QQ:412425870
csdn博客:
http://blog.youkuaiyun.com/caychen
码云:
https://gitee.com/caychen/
github:
https://github.com/caychen

点击群号或者扫描二维码即可加入QQ群:

328243383(1群)



点击群号或者扫描二维码即可加入QQ群:

180479701(2群)



全面掌握C++:从基础知识到STL深入教程 C++中的控制结构用于控制程序的流程,主要包含条件结构和循环结构两大类。条件结构包括ifelse ifelse以及switch语句,它们用于基于条件执行不同的代码块。循环结构包括for循环、while循环和do-while循环,它们用于重复执行一段代码直到满足特定条件。下面是一个使用if语句的例子:} else {这段代码检查变量age是否大于或等于18,如果是,则输出"You are an adult.",否则输出"You are a minor."。 阅读详情

相关推荐

【ESP32】SPI SRAM memory test fail。External RAM failed memory test!

log日志报错如下:这两条报错信息表明外部 SPI SRAM(静态随机存取存储器)的内存测试失败。

weixin_56217406的博客 1024

STL常用算法——排序算法

合并排序,merge() 函数用于将 2 个有序序列合并为 1 个有序容器,前提是这 2 个有序容器的排序规则相同(要么都是升序,要么都是降序)。并且最终借助该函数获得的新有序容器,其排序规则也和这 2 个有序容器要相同。sort() 函数在对自定义的类对象实现排序时,需要在该类的内部提供移动构造函数和移动赋值运算符。sort():对容器或普通数组中范围内的元素进行排序,默认进行升序排序,也可以自定义排序规则。reverse()函数:将容器指定范围内的元素进行反转。函数原型:该函数有以下两种格式。

万里顾一程的博客 1941

保姆级教程:在Ubuntu 22.04上从零安装SUMO并运行第一个交通仿真

本教程详细介绍了在Ubuntu 22.04系统上从零安装SUMO交通仿真软件并运行第一个仿真的完整流程。涵盖环境准备、PPA源安装、核心组件验证、首次仿真案例运行以及进阶配置技巧,特别针对netedit路网编辑器和地图格式转换等实用工具进行重点讲解,帮助用户快速掌握SUMO在交通仿真领域的应用。

weixin_30546189的博客 422

跟我学c++中级篇——STL算法之排序

一、排序算法 数据结构和算法里,或者说在计算机的算法里,排序算法一定是无法绕过的一个算法,而且排序算法种类很多,和树、堆等数据结构都多多少少的互相纠缠。常见的排序算法按不同的特点可以分为比较类型排序和非比较类型排序,内部排序和外部排序等,包括以下几种: 冒泡排序算法、选择排序算法、插入排序算法、快速排序算法、希尔排序算法、堆排序算法、归并排序算法。其它如基数排序算法、桶排序算法和计数排序算法,不是很常见。 其主要的特征如下: order 排序是基本的算法,在各种语言和库中都或多或少的有封装,...

fpcc的专栏 661

麒麟V10 ARM环境离线部署MySQL:从依赖缺失到服务自启的完整避坑指南

本文详细介绍了在麒麟V10 ARM环境下离线部署MySQL的完整流程,包括依赖缺失解决方案、目录配置、服务自启设置及性能调优。特别针对国产操作系统和ARM架构的兼容性问题,提供了实用的避坑指南和优化建议,帮助用户高效完成MySQL部署与维护。

weixin_28741413的博客 409

基于RK3588与FPGA的SDI视频处理系统:从MIPI CSI-2输入到DSI输出的全链路解析

本文深入解析了基于RK3588与FPGA的SDI视频处理系统全链路。系统利用FPGA作为高速接口转换与流管理核心,将SDI信号转换为MIPI CSI-2数据流送入RK3588进行智能图像处理与AI分析,处理结果再通过MIPI DSI回传,最终由FPGA控制编码为SDI输出,实现了专业视频接口与强大算力的高效协同。

s1t2u3的博客 668

【C++STL】快速排序算法(sort)的原理与使用

`std::sort` 是 C++ 标准库中提供的排序算法,它使用的是一种经典的排序算法——**快速排序**(Quicksort)或者是其变种。 快速排序是一种基于比较的排序算法,通过不断地选择一个基准值(pivot),将待排序序列分割为两个子序列,其中一个子序列的所有元素小于等于基准值,另一个子序列的所有元素大于基准值。然后递归地对两个子序列进行排序,最终得到有序序列。

AAADiao的博客 1万+

TCGA之GDC-client工具下载安装与使用

文章主要是对GDC-client工具下载TCGA数据库数据整个过程的一个记录 1.下载GDC-client工具 GDC-client工具网址:GDC Data Transfer Tool | NCI Genomic Data Commons (cancer.gov) 我这里下的是上图中红圈中的版本, 2.解压安装 从网上了解的是不能解压到带中文的路径里,解压后是一个.exe文件,为了能直接在cmd命令行下使用,将其加入系统环境: 点击新建之后,输入将文件解压到的路径,然后...

better_strong的博客 1万+

STL之算法——排序算法

一:介绍 常用的STL排序算法包括sort,reverse,merge,random_shuffle。 二:sort:对容器内元素进行排序 1.函数原型 sort(iterator begin, iterator end) 默认以升序方式对元素进行排序 sort(iterator begin, iterator end, _Pred) 自定义方式对元素排序 2.操作 #include <iostream> #include <algorithm> #include &

qq_38082979的博客 2072

分享一些基于微信小程序开发的小游戏源码

小游戏小程序是运行在微信生态系统(或其他支持小程序的平台)中的轻量级应用程序,专为休闲游戏体验而设计的小程序子类别,小游戏小程序通常体积较小,加载速度快,用户无需等待长时间即可开始游戏。用户无需下载或安装单独的游戏应用程序,即可通过小程序入口直接进入游戏,同时小游戏小程序通常包含排行榜、分享功能等社交元素,可以增强游戏体验并促进用户参与。game.js:游戏页面的逻辑文件,包含页面数据、生命周期函数、事件处理函数等。game.wxml:游戏页面的结构文件,定义了页面的布局和组件。

xinshangdian的博客 6232

EndNote20保姆级安装教程:从下载到汉化一步到位(附闪退解决方案)

本文提供EndNote20的详细安装与汉化教程,涵盖系统准备、分步安装、路径优化及闪退解决方案。针对科研人员的需求,特别优化了中文环境下的使用体验,确保文献管理工具的高效稳定运行。

weixin_30415113的博客 342

STL——排序算法

random_shuffle洗牌算法使用时需要加随机数种子。merge合并两个容器必须是有序序列。容器元素合并,并存储到另一容器中。指定范围内的元素随机调整次序。两个容器必须是有序的。

weixin_64238628的博客 1057

【YOLO】YOLOV5-Seg的Segment模块解析

Segment模块同时输出检测结果和分割掩模,通过轻量级分割头实现实时实例分割

浩瀚之水的专栏 599

C++ STL标准库:算法algorithm

文章目录1. 简介2. 非修改序列算法3. 修改序列算法4. 划分、排序算法5. 堆算法 algorithm- C++ Reference (cplusplus.com) 1. 简介 STL的设计是将数据和算法独立开来,允许任何算法和任何容器交互。 算法对容器中数据进行操作。 容器用来存放数据。 迭代器则是算法与容器之间的桥梁。 分类: 非修改序列算法 指不直接修改所操作的容器内容的算法。 修改序列算法 指可以修改所操作的容器内容的算法。 划分、排序、合并 包含对序列进行划分排序和合并的算法

超级大洋葱的博客 5418

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C++ STL 数据结构与算法(四)

本章探讨了 C++ 标准模板库(STL)算法库中最基本且经常被忽视的一些方面。本章通过分区来阐明序列组织,通过排列来改变序列,以及基于堆的操作的迷人世界。这些操作是许多高级算法和数据结构的基础。通过理解和掌握它们,开发者可以提高其应用程序的效率,优化数据处理,并确保数据集的完整性。在本章中,我们将介绍与 STL 相关的一些主题:分区排列堆操作最佳实践本章中的代码可以在 GitHub 上找到:分区,在其最简单的形式中,是关于根据特定标准组织序列的过程,确保所有满足要求的元素都排在那些不满足要求的元素之前。这是

龙哥盟 2619

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C++——STL

STL相关八股文,整理不易!欢迎一键三连!本文参考了很多材料bibi上的千峰提供的文档以及小程序面试鸭里头的文档!

qq_42615475的博客 880

18、【C++ STL】算法

一、STL算法分类 STL中的算法大致可以分为以下七类: 不变序列算法 变值算法 删除算法 变序算法 排序算法 有序区间算法 数值算法 大多重载的算法都是有两个版本的 用 “==” 判断元素是否相等, 或用 “&amp;amp;lt;”来比较大小。 多出一个类型参数 “Pred” 和函数形参 “Pred op” : 通过表达式 “op(x,y)” 的返回值: ture/false 来判断x是否 “等于”y,或者...

阿牧路泽 239

C++之STL算法

The C++ Standard Template Library(STL) Author:Little_Soul Date:2020.09.18 Menu 一. Algorithms Algorithm Sorting Searching Important STL Algorithms Useful Array algorithms Partition Operations Numeric valarray class 二. Containers Sequence Contain

qq_46240318的博客 557

C++ STL总结

C++ STL容器和算法总结,vector,deque,set,map总结和algorithm头文件、numeric头文件函数总结,黑马程序员视频笔记

m0_73571517的博客 553

C++ STL

C++STL

qq_59328991的博客 1145

C++中的STL(标准模板库)

迭代器是STL容器和算法之间的桥梁,它们提供了一种统一的方式来访问容器中的元素。STL迭代器分为输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器五种类型,每种类型的迭代器都有其特定的功能和限制。STL中的算法包括排序、查找、替换、合并、拷贝等,这些算法都是以泛型的方式实现的,即它们可以用于任何类型的数据,而不需要重复地编写代码。容器是一种存储和管理数据的对象,算法是对数据进行操作的函数,迭代器则是容器和算法之间的桥梁。在本文中,我们将探讨STL的基本概念、使用方法和一些常用的数据结构和算法。

shaozheng0503的博客 2205

【跟学C++】C++STL标准模板库——算法详细整理(下)(Study18)

【跟学C++】C++STL标准模板库——算法整理(下)(Study18)

cqy阳的博客 785

C++ STL算法——排序和相关操作

本文深入探讨了C++ STL中的排序及相关操作算法,包括核心概念、算法家族、实现细节和实战应用。主要内容涵盖: 排序本质与关键术语(稳定/不稳定排序、原地操作等) 核心算法对比表(sort、stable_sort、partial_sort等的时间/空间复杂度及应用场景) 重点算法详解:std::sort(混合排序)、std::stable_sort(稳定排序)、std::partial_sort(Top K)、std::nth_element(分割点查找)和堆操作 实战技巧:算法选择指南、自定义比较器注意事

C++发展史系列已完结,这段时间将会迎来系列作品——C++STL系列,敬请期待。作者邮箱:ljq20110324@outlook.com 898

C++ STL面试题

如果是每次插入元素都扩容k个位置,则每扩容k次要移动n个元素,时间复杂度是O(n)。如果是扩容两倍,则每次扩容n次要移动n个元素,时间复杂度是O(1)。此为简略说法,具体公式会较为复杂。11、Vector如何释放空间?一、什么是STL2、解释一下什么是trivial destructor3、使用智能指针管理内存资源,RAII是怎么回事?4、迭代器:++it、it++哪个好,为什么5、说一下C++左值引用和右值引用6、STL中hashtable的实现?7、简单说一下traits技法。

qq_64168613的博客 823

SLAM 面试时问到的C++问题

目录1.你熟悉的STL有哪些?2.各排序算法的时间复杂度3.Eigen是行优先还是列优先?4.c++ 虚函数与纯虚函数的区别5.map 与 unordered map 区别 1.你熟悉的STL有哪些? STL: vector: 底层实现是一个顺序表结构,可以动态增长长度的数组 deque: 双端队列,deque的底层实现是一个链表数组,序列式容器 list: 底层实现是一个双向链表,序列式容器 map: 底层通常是由一颗红黑树组成,第一个可以称为键(key),第二个可以称为该键的值(value),在map

weixin_45626706的博客 4743

C++泛型编程与STL高级培训

C++泛型编程与STL高级培训 C++泛型编程与STL高级培训C++泛型编程与STL高级培训 2011-08-20 13:56 一、课程目标C++作为一门多风格的程序设计语言,除了强大的面向对象支持外,泛型编程(模板机制)的支持更是极大程度上提高了C++的表...

200
上一篇: C++ STL(17):数值算法
下一篇: C++11特性(16):默认函数控制
caychen
博客等级 码龄9年 110粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值