STL算法---排序算法(二)

23 篇文章 0 订阅
13 篇文章 0 订阅

4. random_shuffle(随机调整次序)

对指定范围内的元素随机调整次序。
重载版本输入一个随机数产生操作
函数原形
template<class RanIt> void random_shuffle(RanIt first, RanIt last);
template<class RanIt, class Fun> void random_shuffle(RanIt first, RanIt last, Fun& f);
/
#include "stdafx.h"
#include <algorithm>
#include <numeric>
#include <functional>
#include <vector>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
	std::vector<int> nV2, nV1;
	std::vector<int>::iterator iter;

	nV1.clear();
	nV1.push_back(14);
	nV1.push_back(16);
	nV1.push_back(15);
	nV1.push_back(11);
	nV1.push_back(10);
	nV1.push_back(13);
	nV1.push_back(-2);
	nV1.push_back(27);
	nV1.push_back(24);
	nV1.push_back(-1);
	nV1.push_back(19);
	nV1.push_back(19);

	// 排序前: 14, 16, 15, 11, 10, 13, -2, 27, 24, -1, 19, 19
	std::random_shuffle(nV1.begin(), nV1.end());
	// 排序后: 19, 16, -1, 15, 14, 19, 27, 11, 10, -2, 24, 13

	nV1.clear();
	nV1.push_back(14);
	nV1.push_back(16);
	nV1.push_back(15);
	nV1.push_back(11);
	nV1.push_back(10);
	nV1.push_back(13);
	nV1.push_back(-2);
	nV1.push_back(27);
	nV1.push_back(24);
	nV1.push_back(-1);
	nV1.push_back(19);
	nV1.push_back(19);

	// 排序前: 14, 16, 15, 11, 10, 13, -2, 27, 24, -1, 19, 19
	std::random_shuffle(nV1.begin(), nV1.end());
	// 排序后: 19, 10, 16, 24, 15, 13, -1, 19, 11, 27, -2, 14
	
	return 0;
}

5. reverse / reverse_copy(反序排序)

5.1 reverse

将指定范围内元素重新反序排序
函数原形
template<class BidIt> void reverse(BidIt first, BidIt last);


5.2 reverse_copy

与reverse类似,不过将结果写入另一个容器
函数原形
template<class BidIt, class OutIt> OutIt reverse_copy(BidIt first, BidIt last, OutIt x);

/
#include "stdafx.h"
#include <algorithm>
#include <numeric>
#include <functional>
#include <vector>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
	std::vector<int> nV2, nV1;
	std::vector<int>::iterator iter;

	nV1.clear();
	nV1.push_back(14);
	nV1.push_back(16);
	nV1.push_back(15);
	nV1.push_back(11);
	nV1.push_back(10);
	nV1.push_back(13);
	nV1.push_back(-2);
	nV1.push_back(27);
	nV1.push_back(24);
	nV1.push_back(-1);
	nV1.push_back(19);
	nV1.push_back(19);

	// 排序前: 14, 16, 15, 11, 10, 13, -2, 27, 24, -1, 19, 19
	std::reverse(nV1.begin(), nV1.end());
	// 排序后: 19, 19, -1, 24, 27, -2, 13, 10, 11, 15, 16, 14

	nV1.clear();
	nV1.push_back(14);
	nV1.push_back(16);
	nV1.push_back(15);
	nV1.push_back(11);
	nV1.push_back(10);
	nV1.push_back(13);
	nV1.push_back(-2);
	nV1.push_back(27);
	nV1.push_back(24);
	nV1.push_back(-1);
	nV1.push_back(19);
	nV1.push_back(19);

	// 排序前nV1: 14, 16, 15, 11, 10, 13, -2, 27, 24, -1, 19, 19
	nV2.resize(nV1.size());
	iter = std::reverse_copy(nV1.begin(), nV1.end(), nV2.begin());
	// 排序前nV1: 14, 16, 15, 11, 10, 13, -2, 27, 24, -1, 19, 19
	// 排序后nV2: 19, 19, -1, 24, 27, -2, 13, 10, 11, 15, 16, 14, end(iter)

	return 0;
}

6. sort / stable_sort

6.1 sort

以升序重新排列指定范围内的元素。
重载版本使用自定义的比较操作
函数原形
template<class RanIt> void sort(RanIt first, RanIt last);
template<class RanIt, class Pred> void sort(RanIt first, RanIt last, Pred pr);


6.2 stable_sort

与sort类似,但保留相等元素之间的顺序关系
函数原形
template<class BidIt> void stable_sort(BidIt first, BidIt last);
template<class BidIt, class Pred> void stable_sort(BidIt first, BidIt last, Pred pr);


/
#include "stdafx.h"
#include <algorithm>
#include <numeric>
#include <functional>
#include <vector>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
	std::vector<int> nV2, nV1;
	std::vector<int>::iterator iter;

	nV1.clear();
	nV1.push_back(14);
	nV1.push_back(16);
	nV1.push_back(15);
	nV1.push_back(11);
	nV1.push_back(10);
	nV1.push_back(13);
	nV1.push_back(-2);
	nV1.push_back(27);
	nV1.push_back(24);
	nV1.push_back(-1);
	nV1.push_back(19);
	nV1.push_back(19);

	// 排序前: 14, 16, 15, 11, 10, 13, -2, 27, 24, -1, 19, 19
	std::sort(nV1.begin(), nV1.end());
	// 排序后: -2, -1, 10, 11, 13, 14, 15, 16, 19, 19, 24, 27

	nV1.clear();
	nV1.push_back(14);
	nV1.push_back(16);
	nV1.push_back(15);
	nV1.push_back(11);
	nV1.push_back(10);
	nV1.push_back(13);
	nV1.push_back(-2);
	nV1.push_back(27);
	nV1.push_back(24);
	nV1.push_back(-1);
	nV1.push_back(19);
	nV1.push_back(19);

	// 排序前: 14, 16, 15, 11, 10, 13, -2, 27, 24, -1, 19, 19
	std::stable_sort(nV1.begin(), nV1.end());
	// 排序后: -2, -1, 10, 11, 13, 14, 15, 16, 19, 19, 24, 27
	return 0;
}

7. rotate / rotate_copy

7.1 rotate

把[first, middle)的元素拷贝到last的后面; 或者说把[middle, last)的元素拷贝到first的前面.
template<class FwdIt> void rotate(FwdIt first, FwdIt middle, FwdIt last);

7.2 rotate_copy

与rotate类似,不过将结果写入另一个容器
函数原形
template<class FwdIt, class OutIt> OutIt rotate_copy(FwdIt first, FwdIt middle, FwdIt last, OutIt x);
/
#include "stdafx.h"
#include <algorithm>
#include <numeric>
#include <functional>
#include <vector>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
	std::vector<int> nV2, nV1;
	std::vector<int>::iterator iter;

	nV1.clear();
	nV1.push_back(14);
	nV1.push_back(16);
	nV1.push_back(15);
	nV1.push_back(11);
	nV1.push_back(10);
	nV1.push_back(13);
	nV1.push_back(-2);
	nV1.push_back(27);
	nV1.push_back(24);
	nV1.push_back(-1);
	nV1.push_back(19);
	nV1.push_back(19);

	// 排序前: 14, 16, 15, 11, 10(middle), 13, -2, 27, 24, -1, 19, 19
	std::rotate(nV1.begin(), nV1.begin() + 4, nV1.end());
	// 排序后: 10, 13, -2, 27, 24, -1, 19, 19, 14, 16, 15, 11

	nV1.clear();
	nV1.push_back(14);
	nV1.push_back(16);
	nV1.push_back(15);
	nV1.push_back(11);
	nV1.push_back(10);
	nV1.push_back(13);
	nV1.push_back(-2);
	nV1.push_back(27);
	nV1.push_back(24);
	nV1.push_back(-1);
	nV1.push_back(19);
	nV1.push_back(19);
	nV2.resize(nV1.size());
	// 排序前: 14, 16, 15, 11, 10(middle), 13, -2, 27, 24, -1, 19, 19
	std::rotate_copy(nV1.begin(), nV1.begin() + 4, nV1.end(), nV2.begin());
	// 排序后nV2: 10, 13, -2, 27, 24, -1, 19, 19, 14, 16, 15, 11, end(iter)

	return 0;
}

8. inplace_merge / merge

8.1 inplace_merge

合并两个有序序列,结果序列覆盖两端范围。
重载版本使用输入的操作进行排序
函数原形
template<class BidIt> void inplace_merge(BidIt first, BidIt middle, BidIt last);
template<class BidIt, class Pred> void inplace_merge(BidIt first, BidIt middle, BidIt last, Pred pr);

8.2 merge

合并两个有序序列,存放到另一个序列。重载版本使用自定义的比较
函数原形
template<class InIt1, class InIt2, class OutIt> OutIt merge(InIt1 first1, InIt1 last1,InIt2 first2, InIt2 last2, OutIt x);
template<class InIt1, class InIt2, class OutIt, class Pred> OutIt merge(InIt1 first1, InIt1 last1,InIt2 first2, InIt2 last2, OutIt x, Pred pr);

/
#include "stdafx.h"
#include <algorithm>
#include <numeric>
#include <functional>
#include <vector>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
	std::vector<int> nV2, nV1, nV3;
	std::vector<int>::iterator iter;

	nV1.clear();
	nV1.push_back(12);
	nV1.push_back(13);
	nV1.push_back(14);
	nV1.push_back(15);
	nV1.push_back(50);
	nV1.push_back(7);		// --
	nV1.push_back(23);
	nV1.push_back(27);
	nV1.push_back(28);
	nV1.push_back(30);
	nV1.push_back(34);
	nV1.push_back(35);
	nV1.push_back(37);

	// nV1中包含了两组有序序列
	// 排序前: 12, 13, 14, 15, 50, 7(middle), 23, 27, 28, 30, 34, 35, 37
	std::inplace_merge(nV1.begin(), nV1.begin() + 5, nV1.end());
	// 排序后: 7, 12, 13, 14, 15, 23, 27, 28, 30, 34, 35, 37, 50

	// 升序
	nV1.clear();
	nV1.push_back(14);
	nV1.push_back(16);
	nV1.push_back(18);
	nV1.push_back(20);

	// 升序
	nV2.clear();
	nV2.push_back(-2);
	nV2.push_back(13);
	nV2.push_back(20);
	nV2.push_back(25);
	nV2.push_back(26);
	nV3.resize(nV1.size() + nV2.size());
	iter = std::merge(nV1.begin(), nV1.end(), nV2.begin(), nV2.end(), nV3.begin());
	// 排序后nV3: -2, 13, 14, 16, 18, 20, 20, 25, 26, end(iter)
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值