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

本文介绍了C++STL中的四种常用排序算法:sort用于排序,random_shuffle用于随机打乱元素顺序,merge用于合并两个有序序列,reverse则用于反转序列。示例代码展示了这些算法的使用方法和注意事项,如sort的自定义排序规则,random_shuffle的非完全随机性以及merge和reverse的操作过程。
摘要由CSDN通过智能技术生成

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

前情回顾

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

常用排序算法

  • 常用的排序算法有有四种
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++爬塔日记
🙉都看到这里了,留下你们的👍点赞+⭐收藏+📋评论吧🙉

评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

封心锁爱的前夫哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值