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;


相关文章
|
20天前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
60 5
|
20天前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
44 1
|
25天前
|
存储 算法 C++
高精度算法(加、减、乘、除,使用c++实现)
高精度算法(加、减、乘、除,使用c++实现)
296 0
高精度算法(加、减、乘、除,使用c++实现)
|
25天前
|
算法 搜索推荐 Java
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
基数排序是一种稳定的排序算法,通过将数字按位数切割并分配到不同的桶中,以空间换时间的方式实现快速排序,但占用内存较大,不适合含有负数的数组。
21 0
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
|
29天前
|
算法 安全 Linux
【C++STL简介】——我与C++的不解之缘(八)
【C++STL简介】——我与C++的不解之缘(八)
|
22天前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
16 0
|
24天前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
29 0
|
1月前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
66 0
|
1月前
|
存储 算法 决策智能
【算法】博弈论(C/C++)
【算法】博弈论(C/C++)
|
1月前
|
存储 算法 C++
【算法】哈希映射(C/C++)
【算法】哈希映射(C/C++)