STL常用算法之排序算法详解

 更新时间:2024年01月05日 10:18:22   作者:万里顾—程  
这篇文章主要介绍了STL常用算法之排序算法详解,STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器、空间配置器,本文主要讲算法中的排序算法,需要的朋友可以参考下

STL常用算法排序算法

1、sort()

  • sort():对容器或普通数组中范围内的元素进行排序,默认进行升序排序,也可以自定义排序规则。
  • sort() 函数只对 array、vector、deque 这 3 个容器提供支持。
  • sort() 函数在对自定义的类对象实现排序时,需要在该类的内部提供移动构造函数和移动赋值运算符。

函数原型:该函数有以下两种语法格式

//对 [beg, end) 区域内的元素做默认的升序排序
sort (iterator beg,iterator end);
//按照指定的 comp 排序规则,对 [beg, end) 区域内的元素进行排序
sort (iterator beg,iterator end, Compare comp);  

参数说明:

  • beg 开始迭代器
  • end 结束迭代器
  • comp 标准库提供的排序规则(如 greater<T>);或普通函数以及函数对象接收的自定义的排序规则

默认排序和标准库提供的排序

#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>

void myPrint(int val) {
	cout << val << " ";
}
void test01() {
	vector<int> v{1,4,5,3,2};
	//默认升序排序
	sort(v.begin(), v.end());//1 2 3 4 5
	for_each(v.begin(), v.end(), myPrint);
	cout << endl;
	//从大到小排序,标准库提供的排序规则
	sort(v.begin(), v.end(), greater<int>());//5 4 3 2 1
	for_each(v.begin(), v.end(), myPrint);
	cout << endl;
}
int main() {
	test01();
	system("pause");
	return 0;
}

自定义排序规则

#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>

void myPrint(int val) {
	cout << val << " ";
}
//以普通函数的方式实现自定义排序规则(升序)
bool mycomp(int i, int j) {
	return (i < j);
}
//以函数对象的方式实现自定义排序规则(升序)
class mycomp2 {
public:
	bool operator() (int i, int j) {
		return (i < j);
	}
};

void test01() {
	vector<int> v{ 32, 71, 12, 45, 26, 80, 53, 33 };
	
	sort(v.begin(), v.end(), mycomp);//12 26 32 33 45 53 71 80
	for_each(v.begin(), v.end(), myPrint);
	cout << endl;
	
	sort(v.begin(), v.end(), mycomp2());//12 26 32 33 45 53 71 80
	for_each(v.begin(), v.end(), myPrint);
	cout << endl;
}
int main() {
	test01();
	system("pause");
	return 0;
}

2、random_shuffle()

random_shuffle():指定范围内的元素随机调整次序

函数原型:

random_suffle(iterator beg,iterator end);

参数说明:

  • beg 开始迭代器
  • end 结束迭代器
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<ctime>

void myPrint(int val) {
	cout << val << " ";
}
void test01() {
	vector<int> v;
	for (int i = 0; i < 10; i++) {
		v.push_back(i);
	}
	//打乱顺序前的遍历
	for_each(v.begin(), v.end(), myPrint);
	cout << endl;
	//打乱顺序后的遍历
	random_shuffle(v.begin(), v.end());
	for_each(v.begin(), v.end(), myPrint);
	cout << endl;
}
int main() {
	//加入随机数种子,使每次程序启动的随机数都不一样
	srand((unsigned int)time(NULL));
	test01();
	system("pause");
	return 0;
}

在这里插入图片描述

3、merge()

合并排序,merge() 函数用于将 2 个有序序列合并为 1 个有序容器,前提是这 2 个有序容器的排序规则相同(要么都是升序,要么都是降序)。并且最终借助该函数获得的新有序容器,其排序规则也和这 2 个有序容器要相同。

函数原型:该函数有以下两种格式

//默认升序为排序规则,[beg1, end1) 和 [beg2, end2) 指定区域内的元素必须支持 < 小于运算符
merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
//自定义的 comp 规则作为排序规则,[beg1, end1) 和 [beg2, end2) 指定区域内的元素必须支持comp 排序规则内的比较运算符
merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest, Compare comp);

参数说明:

  • beg1 容器1开始迭代器
  • end1 容器1结束迭代器
  • beg2 容器2开始迭代器
  • end2 容器2结束迭代器
  • dest 目标容器开始迭代器,为最终生成的新有序序列指定存储位置
  • comp 用于自定义排序规则

默认排序

void myPrint(int val) {
	cout << val << " ";
}
void test01() {
	//有序的容器
	vector<int> v1;
	vector<int> v2;
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
		v2.push_back(i * 2);
	}
	//新有序容器
	vector<int> v3;
	//一定要提前给容器分配空间
	v3.resize(v1.size() + v2.size());
	merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
	//打印出来的还是个有序序列
	for_each(v3.begin(), v3.end(), myPrint);//0 0 1 2 2 3 4 4 5 6 6 7 8 8 9 10 12 14 16 18
	cout << endl;
}

自定义排序规则

void myPrint(int val) {
	cout << val << " ";
}

//以普通函数的方式实现自定义排序规则(降序)
bool mycomp(int i, int j) {
	return (i > j);
}
//以函数对象的方式实现自定义排序规则(降序)
class mycomp2 {
public:
	bool operator() (int i, int j) {
		return (i > j);
	}
};

void test01() {
	//有序的容器
	vector<int> v1;
	vector<int> v2;
	for (int i = 10; i > 0; i--) {
		v1.push_back(i);
		v2.push_back(i * 2);
	}
	//新有序容器
	vector<int> v3;
	//一定要提前给容器分配空间
	v3.resize(v1.size() + v2.size());

	merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin(), mycomp);
	for_each(v3.begin(), v3.end(), myPrint);//20 18 16 14 12 10 10 9 8 8 7 6 6 5 4 4 3 2 2 1
	cout << endl;

	merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin(), mycomp2());
	for_each(v3.begin(), v3.end(), myPrint);//20 18 16 14 12 10 10 9 8 8 7 6 6 5 4 4 3 2 2 1
	cout << endl;
}

4、reverse()

reverse()函数:将容器指定范围内的元素进行反转

函数原型:

reverse(iterator beg,iterator end);

参数说明:

  • beg 开始迭代器
  • end 结束迭代器
void myPrint(int val) {
	cout << val << " ";
}
void test01() {
	vector<int> v1;
	//有序的容器
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
	}
	reverse(v1.begin(), v1.end());
	for_each(v1.begin(), v1.end(), myPrint);//9 8 7 6 5 4 3 2 1 0
	cout << endl;
}

到此这篇关于STL常用算法之排序算法详解的文章就介绍到这了,更多相关STL排序算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于Qt添加opencv和libtorch库的问题

    关于Qt添加opencv和libtorch库的问题

    这篇文章主要介绍了Qt添加opencv和libtorch库的相关知识,两种方法一种是通过手动添加,一种是通过qt creator添加,需要的朋友可以参考下
    2022-01-01
  • 利用C语言实现经典多级时间轮定时器

    利用C语言实现经典多级时间轮定时器

    C语言是一门通用计算机编程语言,广泛应用于底层开发,这篇文章主要给大家介绍了关于利用C语言实现经典多级时间轮定时器的相关资料,需要的朋友可以参考下
    2021-07-07
  • C++求阶乘的两种方法

    C++求阶乘的两种方法

    这篇文章主要介绍了C++求阶乘的两种方法,有需要的朋友可以参考一下
    2013-12-12
  • C++对象内存分布详解(包括字节对齐和虚函数表)

    C++对象内存分布详解(包括字节对齐和虚函数表)

    下面小编就为大家带来一篇C++对象内存分布详解(包括字节对齐和虚函数表)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C语言排序算法之冒泡排序实现方法【改进版】

    C语言排序算法之冒泡排序实现方法【改进版】

    这篇文章主要介绍了C语言排序算法之冒泡排序实现方法,结合具体实例形式分析了C语言实现的基本冒泡排序实现方法及增设flag标志位的改进型算法,需要的朋友可以参考下
    2017-09-09
  • C C++ 题解LeetCode2360图中的最长环示例

    C C++ 题解LeetCode2360图中的最长环示例

    这篇文章主要为大家介绍了C C++ 题解LeetCode2360图中的最长环示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • C++详细分析引用的使用及其底层原理

    C++详细分析引用的使用及其底层原理

    引用是C++一个很重要的特性,顾名思义是某一个变量或对象的别名,对引用的操作与对其所绑定的变量或对象的操作完全等价,这篇文章主要给大家总结介绍了C++中引用的相关知识点,需要的朋友可以参考下
    2022-04-04
  • C++实现模板方法模式的示例代码

    C++实现模板方法模式的示例代码

    这篇文章主要介绍了++实现模板方法模式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • C++ Boost Graph算法超详细精讲

    C++ Boost Graph算法超详细精讲

    这篇文章主要介绍了C++ Boost Graph算法,我门尝试使用Boost.Graph库来运行Goldberg的最大流算法。 Boost.Graph将其称为push_relabel_max_flow
    2022-10-10
  • C语言链表实现图书管理系统

    C语言链表实现图书管理系统

    这篇文章主要为大家详细介绍了C语言链表实现图书管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01

最新评论