C++STL算法篇之排序和通用算法

简介: C++STL算法篇之排序和通用算法

使用算法的时候,包含的头文件

functional和algorithm

排序的准则

默认的排序准则

1.less<类型>() 从小到大

greater<类型>() 从大到小

2.如果想要自定义排序的准则

可以通过仿函数,lambda表达式,函数适配器来实现**

sort排序

默认的是从小到大排序

#include<iostream>
#include<functional>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
int main()
{
  //1.sort排序
  vector<int> m = { 3,5, 6, 0, 1, 3, 7, 5, 3 };
  sort(m.begin(), m.end());
  sort(m.begin(), m.end(), less<int>()); //默认从小到大排序
  copy(m.begin(), m.end(), ostream_iterator<int>(cout, " ")); //流的方式打印数据
  cout << endl;
  sort(m.begin(), m.end(), greater<int>());
  copy(m.begin(), m.end(), ostream_iterator<int>(cout, " "));
  return 0;
}

注意:链表的排序不能使用sort算法,因为链表不是连续的,对于链表的排序可以调用内置的sort算法

stable_sort(保持相对顺序的排序)

使用lambda表达式和强制类型转换

以及copy函数打印

//2 stable_sort.
  //保持相对顺序的排序
  //一般使用double类型的数据
  vector<double> m1 = { 1.11, 5.23, 3.23, 7.89, 5.21, 9.99, 11.1, 2.22, 2.23 };
  stable_sort(m1.begin(), m1.end(), [](double a, double b) {return int(a) < int(b); }); //double类型用整形的类型来比较
  copy(m1.begin(), m1.end(), ostream_iterator<double>(cout, " "));

merge(归并排序)

不改变原容器的数据

有5个参数,实际上就是将2个有序的数组,合并成一个有序的数组,如果你会归并排序,那么就对此不陌生

前2个参数,表示第一个有序数组的范围

后面2个参数表示第二个有序数组的范围

最后一个参数表示数据打印的位置

//3.merge 归并排序
vector<int> m3 = { 1, 2, 4, 5, 0,4, 6, 7 };
  vector<int> result(m3.size());
  merge(m3.begin(), m3.begin() + 4, m3.begin() + 4, m3.end(), result.begin());
  copy(result.begin(), result.end(), ostream_iterator<int>(cout, " "));

inplace_merge(归并排序)

直接作用到原容器上面

//4.inplace_merge(直接作用到原容器上面)
  vector<int> m5 = { 1, 2, 4, 5, 0,4, 6, 7 };
  inplace_merge(m5.begin(), m5.begin() + 4, m5.end());
  copy(m5.begin(), m5.end(), ostream_iterator<int>(cout, " "));

nth_element(关键字排序)

实际上就理解成一种特殊的排序方式,结果其实跟归并排序貌似一样

//5.nth_element(关键字排序)
vector<int> m6 = { 1, 2, 4, 5, 0,4, 6, 7 };
  nth_element(m6.begin(), m6.begin() + 4, m6.end());
  copy(m6.begin(), m6.end(), ostream_iterator<int>(cout, " "));

partition

分类处理,按特定的条件把数据分为2组

/6.分类处理 partition
  vector<int> date = { 1, 3, 5, 7, 9, 0, 2, 4, 5 };
  partition(date.begin(), date.end(), [](int a) {return a< 6; });
  copy(date.begin(), date.end(), ostream_iterator<int>(cout, " ")); 
  //小于6的放到左边,大于6的放到右边

stable_partition

保持数据相对顺序,分类处理

一般是浮点数

//7.保持数据的相对稳定 一般用于浮点数
  //stable_partition
  vector<double> date1 = { 1.2, 0.3, 0.1, 2.4, 1.9, 6.9, 4.5 };
  stable_partition(date1.begin(), date1.end(), [](double a) {return int(a) < 2; });
  copy(date1.begin(), date1.end(),ostream_iterator<double>(cout, " "));

partial_sort(局部排序)

partial_sort_copy

局部排序的结果放到新的容器里

//9.局部排序结果另存 partial_sort_copy
  vector<int> mmm1 = { 1, 4, 4, 3, 2 };
  vector<int> result1(2);
  partial_sort_copy(mmm1.begin(), mmm1.begin() + 2, result1.begin(), result1.end());
  copy(result1.begin(), result1.end(), ostream_iterator<int>(cout, " "));

random_shuffle

乱序算法

注意:这里乱序算法一般搭配随机数种子使用,不然的话,每次出现的结果是一样的

//10.乱序算法 random_shuffle
  //随机数种子
  srand((unsigned)time(nullptr));
  vector<int> mmm2 = { 1, 2 ,3, 4, 5, 6, 7, 8, 9 };
  random_shuffle(mmm2.begin(), mmm2.end());
  copy(mmm2.begin(), mmm2.end(), ostream_iterator<int>(cout, " "));

reverse(逆置)

//11.逆置 reserve
  string str1 = "I love you";
  reverse(str1.begin(), str1.end());
  cout << str1 << endl;

reverse_copy( 逆置另存)

注意:另存的容器都要定义大小,刚定义是没有空间,不然就会出现越界问题

//12.逆置另存  reverse_copy
  string str2 = "ABCDEFG";
  string str3;
  str3.resize(77); //创建空间大
  reverse_copy(str2.begin(), str2.end(), str3.begin());
  cout << str3 << endl;

rotate(移动元素到末尾)

//13.移动元素到末尾 rotate
  string str4 = "ABCDEF";
  rotate(str4.begin(), str4.begin() + 2, str4.end());
  cout << str4 << endl;
  //将前2个元素 移到末尾

rotate_copy

移动元素到末尾结果另存

//14.移动元素到末尾另存 rotate_copy
  string str5 = "ABCDEFGHIJK";
  string str6;
  str6.resize(str5.size());
  rotate_copy(str5.begin(), str5.begin() + 4, str5.end(), str6.begin());
  cout << str6 << endl;


相关文章
|
29天前
|
算法 C++ 容器
C++标准库中copy算法的使用
C++标准库中copy算法的使用
14 1
|
28天前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
29天前
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
16 1
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
22天前
|
算法 搜索推荐 Java
算法实战:手写归并排序,让复杂排序变简单!
归并排序是一种基于“分治法”的经典算法,通过递归分割和合并数组,实现O(n log n)的高效排序。本文将通过Java手写代码,详细讲解归并排序的原理及实现,帮助你快速掌握这一实用算法。
34 0
|
1月前
|
算法 关系型数据库 MySQL
揭秘MySQL中的版本号排序:这个超级算法将颠覆你的排序世界!
【8月更文挑战第8天】在软件开发与数据管理中,正确排序版本号对软件更新及数据分析至关重要。因MySQL默认按字符串排序版本号,可能出现&#39;1.20.0&#39;在&#39;1.10.0&#39;之前的不合理情况。解决办法是将版本号各部分转换为整数后排序。例如,使用`SUBSTRING_INDEX`和`CAST`函数从`software`表的`version`字段提取并转换版本号,再按这些整数排序。这种方法可确保版本号按逻辑正确排序,适用于&#39;major.minor.patch&#39;格式的版本号。对于更复杂格式,需调整处理逻辑。掌握此技巧可有效应对版本号排序需求。
69 3
|
22天前
|
算法 搜索推荐 C++
c++常见算法
C++中几种常见算法的示例代码,包括查找数组中的最大值、数组倒置以及冒泡排序算法。
14 0
|
28天前
|
算法 搜索推荐
算法设计 (分治法应用实验报告)基于分治法的合并排序、快速排序、最近对问题
这篇文章是关于分治法应用的实验报告,详细介绍了如何利用分治法实现合并排序和快速排序算法,并探讨了使用分治法解决二维平面上的最近对问题的方法,包括伪代码、源代码实现及时间效率分析,并附有运行结果和小结。
|
29天前
|
算法 C++ 容器
【C++算法】双指针
【C++算法】双指针
|
1月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
17 0
|
2月前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
【7月更文挑战第12天】归并排序是高效稳定的排序算法,采用分治策略。Python 实现包括递归地分割数组及合并已排序部分。示例代码展示了如何将 `[12, 11, 13, 5, 6]` 分割并归并成有序数组 `[5, 6, 11, 12, 13]`。虽然 $O(n log n)$ 时间复杂度优秀,但需额外空间,适合大规模数据排序。对于小规模数据,可考虑其他算法。**
64 4