• STL算法——常用排序算法(sort、random_suffle、merge、reverse)


    5.3 常用排序算法

    算法简介:

    • sort //对容器内元素进行排序
    • random_suffle //洗牌 指定范围内的元素随机体哦阿正次序
    • merge //容器元素合并,并存储到另一容器中
    • reverse //反转指定范围的元素

    5.3.1 sort

    功能描述:

    • 对容器内元素进行排序

    函数原型:

    • sort(iterator beg, iterator end, _Pred);
      • 对容器内元素进行排序
      • beg 开始迭代器
      • end 结束迭代器
      • _Pred 谓词

    示例:

    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    //排序 sort
    
    //打印输出
    void PriVec(int val) {
    	cout << val << " ";
    }
    
    //创建二元谓词来降序排列
    class Descending {
    public:
    	bool operator()(int val1, int val2) {
    		return val1 > val2;
    	}
    };
    
    void test01() {
    	vector<int> v;
    	v.push_back(1);
    	v.push_back(4);
    	v.push_back(5);
    	v.push_back(2);
    	v.push_back(3);
    
    	//常规排序
    	sort(v.begin(), v.end());
    	for_each(v.begin(), v.end(), PriVec);
    	cout << endl;
    
    	//降序排列
    	sort(v.begin(), v.end(), Descending());
    	for_each(v.begin(), v.end(), PriVec);
    	cout << endl;
    }
    
    //主函数
    int main() {
    	test01();
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    5.3.2 random_shuffle

    功能描述:

    • 洗牌 知道那个范围内的元素随机调整次序

    函数原型:

    • random_shuffle(iterator beg, iterator end);
      • 指定范围内的元素随机调整次序
      • beg 开始迭代器
      • end 结束迭代器

    示例:

    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<ctime>
    using namespace std;
    
    //指定范围内的元素随机调整次序
    
    //打印输出
    class PriVec {
    public:
    	void operator()(int val) {
    		cout << val << " ";
    	}
    };
    
    void test01() {
    	vector<int> v;
    	for (int i = 0; i < 10; i++) {
    		v.push_back(i);
    	}
    
    	cout << "原顺序:";
    	for_each(v.begin(), v.end(), PriVec());
    	cout << endl;
    
    	//注意:虽然打乱了,但是每次运行的相同次都是一样的
    	//可以加一个随机数种子完成真实打乱
    	cout << "第一次洗牌:";
    	random_shuffle(v.begin(), v.end());
    	for_each(v.begin(), v.end(), PriVec());
    	cout << endl;
    	cout << "第二次洗牌:";
    	random_shuffle(v.begin(), v.end());
    	for_each(v.begin(), v.end(), PriVec());
    	cout << endl;
    
    }
    
    
    //主函数
    int main() {
    	//随机数种子
    	srand((unsigned int)time(NULL));
    	test01();
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    总结:random_shuffle洗牌算法比较实用,使用时记得加随机数种子

    5.3.3 merge

    功能描述:

    • 两个元素合并,并存储到零一容器中

    函数原型:

    • merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
      • 容器元素合并,并存储到另一种容器中
      • 注意:两个容器必须是有序的
      • beg1 容器1开始迭代器
      • end1 容器1结束迭代器
      • beg2 容器2开始迭代器
      • end2 容器2结束迭代器
      • dest 目标容器开始迭代器

    示例:

    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    //两个容器元素合并,并存储到零一容器中 merge
    
    //打印
    class Print {
    public:
    	void operator()(int val) {
    		cout << val << " ";
    	}
    };
    
    void test01() {
    
    	vector<int> v1;
    	v1.push_back(2);
    	v1.push_back(3);
    	v1.push_back(4);
    	v1.push_back(5);
    
    	vector<int> v2;
    	v2.push_back(1);
    	v2.push_back(7);
    	v2.push_back(8);
    
    	vector<int> vTarget;
    	//扩容
    	vTarget.resize(v1.size() + v2.size());
    	
    	merge(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
    	for_each(vTarget.begin(), vTarget.end(), Print());
    }
    
    //主函数
    int main() {
    	test01();
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    5.3.4 reverse

    功能描述:

    • 将容器内元素进行反转

    函数原型:

    • reverse(iterator beg, iterator end);
      • 反转反转范围的元素
      • beg 开始迭代器
      • end 结束迭代器

    示例:

    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    //将容器内元素进行反转 reverse
    
    //打印
    class myPrint {
    public:
    	void operator()(int val) {
    		cout << val << " ";
    	}
    };
    
    void test01() {
    	vector<int> v;
    	v.push_back(1);
    	v.push_back(2);
    	v.push_back(3);
    	v.push_back(4);
    
    	cout << "原容器:";
    	for_each(v.begin(), v.end(), myPrint());
    	cout << endl;
    	cout << "反转后的容器:";
    	reverse(v.begin(), v.end());
    	for_each(v.begin(), v.end(), myPrint());
    	cout << endl;
    }
    
    
    //主函数
    int main() {
    	test01();
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
  • 相关阅读:
    深入浅出Java的多线程编程——第二篇
    Ubuntu 22.04.3 LTS单机私有化部署sealos desktop
    vue3 点击后弹窗
    Activiti简单介绍
    Matlab 画图(超详细)
    流水线作业
    第4季1:将AR0130摄像头更换为OV9712摄像头
    企业跨境出海选择AWS怎么样?
    找到 K 个最接近的元素(java,算法)
    react中使用监听
  • 原文地址:https://blog.csdn.net/crisp077/article/details/125491962