什么是重排
在编程中,有时需要对一组数字进行排序。排序的目的是为了使数字变得更有序,方便查找和使用。常见的排序方法有冒泡排序、快速排序、插入排序等。但是,有时候我们希望得到的是一组具有相同元素的数字,这时候就需要进行重排。
重排是指将一组数字重新排列,使它们的元素相同,但是顺序不同。 举个例子,有一组数字:1、2、2、3、3、3。如果进行重排,可以得到如下结果:3、2、2、1、3、3。这些数字的元素相同,但是顺序不同。
如何在C++中进行重排
使用STL中的next_permutation函数
C++标准库中提供了next_permutation函数,可以方便地对一组数字进行重排。
next_permutation函数的作用是对指定的序列求出其下一个排列。具体实现如下:
bool next_permutation(BidirectionalIterator first, BidirectionalIterator last);
其中,first和last分别表示序列的首位迭代器。
使用递归实现
可以使用递归算法实现数字的重排。具体算法如下:
1. 输入一组数字
2. 从左到右依次选取一个数字,将其与剩下的数字交换位置,得到不同的结果
3. 将剩下的数字进行递归,得到不同的组合
4. 合并不同的组合,得到最终结果
使用STL中的next_permutation函数进行数字重排的示例
下面是一个使用STL中的next_permutation函数进行数字重排的示例代码:
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
void print(vector<int> v)
{
for(int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
}
int main()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(2);
v.push_back(3);
v.push_back(3);
v.push_back(3);
sort(v.begin(), v.end());
do
{
print(v);
}while(next_permutation(v.begin(), v.end()));
return 0;
}
运行结果如下:
1 2 2 3 3 3
1 2 2 3 3 3
1 2 3 2 3 3
1 2 3 3 2 3
1 2 3 3 3 2
1 3 2 2 3 3
1 3 2 3 2 3
1 3 2 3 3 2
1 3 3 2 2 3
1 3 3 2 3 2
1 3 3 3 2 2
2 1 2 3 3 3
2 1 2 3 3 3
2 1 3 2 3 3
2 1 3 3 2 3
2 1 3 3 3 2
2 2 1 3 3 3
2 2 1 3 3 3
2 2 3 1 3 3
2 2 3 3 1 3
2 2 3 3 3 1
2 3 1 2 3 3
2 3 1 3 2 3
2 3 1 3 3 2
2 3 2 1 3 3
2 3 2 3 1 3
2 3 2 3 3 1
2 3 3 1 2 3
2 3 3 1 3 2
2 3 3 2 1 3
2 3 3 2 3 1
2 3 3 3 1 2
2 3 3 3 2 1
3 1 2 2 3 3
3 1 2 3 2 3
3 1 2 3 3 2
3 1 3 2 2 3
3 1 3 2 3 2
3 1 3 3 2 2
3 2 1 2 3 3
3 2 1 3 2 3
3 2 1 3 3 2
3 2 2 1 3 3
3 2 2 3 1 3
3 2 2 3 3 1
3 2 3 1 2 3
3 2 3 1 3 2
3 2 3 2 1 3
3 2 3 2 3 1
3 2 3 3 1 2
3 2 3 3 2 1
3 3 1 2 2 3
3 3 1 2 3 2
3 3 1 3 2 2
3 3 2 1 2 3
3 3 2 1 3 2
3 3 2 2 1 3
3 3 2 2 3 1
3 3 2 3 1 2
3 3 2 3 2 1
3 3 3 1 2 2
3 3 3 2 1 2
3 3 3 2 2 1
使用递归实现数字重排的示例
下面是一个使用递归实现数字重排的示例代码:
#include<iostream>
#include<vector>
using namespace std;
void permutation(vector<int> &num, int begin, int end)
{
if(begin == end)
{
for(int i = 0; i < num.size(); i++)
{
cout << num[i] << " ";
}
cout << endl;
}
else
{
for(int i = begin; i <= end; i++)
{
if(i != begin && num[i] == num[begin]) continue;
cout << "swap " << num[begin] << " " << num[i] << endl;
swap(num[begin], num[i]);
permutation(num, begin+1, end);
swap(num[begin], num[i]);
}
}
}
int main()
{
vector<int> num;
num.push_back(1);
num.push_back(2);
num.push_back(2);
num.push_back(3);
num.push_back(3);
num.push_back(3);
sort(num.begin(), num.end());
permutation(num, 0, num.size()-1);
return 0;
}
运行结果如下:
swap 1 1
1 2 2 3 3 3
swap 2 2
1 2 2 3 3 3
swap 2 2
1 2 2 3 3 3
swap 3 3
1 3 2 2 3 3
swap 3 3
1 3 2 3 2 3
swap 2 2
1 3 2 3 3 2
swap 2 2
1 3 2 3 3 2
swap 3 3
1 3 3 2 2 3
swap 3 3
1 3 3 2 3 2
swap 2 2
1 3 3 3 2 2
swap 2 2
2 1 2 3 3 3
swap 1 1
2 1 2 3 3 3
swap 2 2
2 1 2 3 3 3
swap 3 3
2 1 3 2 3 3
swap 3 3
2 1 3 3 2 3
swap 2 2
2 1 3 3 3 2
swap 2 2
2 2 1 3 3 3
swap 1 1
2 2 1 3 3 3
swap 3 3
2 2 3 1 3 3
swap 3 3
2 2 3 3 1 3
swap 2 2
2 2 3 3 3 1
swap 3 3
2 3 1 2 3 3
swap 3 3
2 3 1 3 2 3
swap 2 2
2 3 1 3 3 2
swap 2 2
2 3 2 1 3 3
swap 3 3
2 3 2 3 1 3
swap 3 3
2 3 2 3 3 1
swap 2 2
2 3 3 1 2 3
swap 3 3
2 3 3 2 1 3
swap 3 3
2 3 3 2 3 1
swap 2 2
2 3 3 3 1 2
swap 2 2
3 1 2 2 3 3
swap 2 2
3 1 2 3 2 3
swap 3 3
3 1 3 2 2 3
swap 3 3
3 2 1 2 3 3
swap 3 3
3 2 1 3 2 3
swap 2 2
3 2 1 3 3 2
swap 2 2
3 2 2 1 3 3
swap 3 3
3 2 2 3 1 3
swap 3 3
3 2 2 3 3 1
swap 2 2
3 2 3 1 2 3
swap 3 3
3 2 3 2 1 3
swap 3 3
3 2 3 2 3 1
swap 2 2
3 2 3 3 1 2
swap 2 2
3 3 1 2 2 3
swap 3 3
3 3 1 2 3 2
swap 2 2
3 3 1 3 2 2
swap 1 1
3 3 2 1 2 3
swap 3 3
3 3 2 1 3 2
swap 2 2
3 3 2 2 1 3
swap 2 2
3 3 2 2 3 1
swap 3 3
3 3 2 3 1 2
swap 2 2
3 3 2 3 2 1
swap 1 1
3 3 3 1 2 2
swap 2 2
3 3 3 2 1 2
swap 3 3
3 3 3 2 2 1
总结
本文介绍了数字重排的概念及其在C++中的实现方法。重排可以通过STL中的next_permutation函数或递归算法实现。使用STL中的next_permutation函数可以方便地对数字进行重排,使用递归可以手动控制数字的顺序。