在C++中,将一个同时可以被其重排的数字重新排列

什么是重排

在编程中,有时需要对一组数字进行排序。排序的目的是为了使数字变得更有序,方便查找和使用。常见的排序方法有冒泡排序、快速排序、插入排序等。但是,有时候我们希望得到的是一组具有相同元素的数字,这时候就需要进行重排。

重排是指将一组数字重新排列,使它们的元素相同,但是顺序不同。 举个例子,有一组数字: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函数可以方便地对数字进行重排,使用递归可以手动控制数字的顺序。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签