生活随笔
收集整理的这篇文章主要介绍了
全排列的生成
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
将会以生成一个’ABCDE’的一个全排列为例
全排列的生成,就是从后面数,找到第一符合顺序的(如: ‘D’ < ‘E’)这样的信号。就要开始处理。
处理方法是:
将找到这个符合顺序的位置(如:’B’ < ‘C’),那么就把’C’后面(包括’C’在内的字符串生成一个排好顺序(恢复熵值)),再从左边走,找到第一个比’B’大的字符,那么就把这两个字符的位置交换。
其实本质上是将比’B’大的数中最小的那个给拿出来,然后交换,再排好序,不过根据这样的算法,实现了同样的效果。
这是这个代码跟大多的全排列生成的不一样的地方
代码如下:
#include <iostream>
using namespace std;
string s =
"ABCDE";
void sort(
int start,
int end){
for (
int i = start; i < end; ++i){
for (
int j = i +
1; j <= end; ++j){
if (s[i] > s[j]){
char t = s[i];s[i] = s[j];s[j] = t;}}}
}
void findALittleBigger(
int j ,
int start){
for (
int i = start; i <=
4; ++i){
if (s[i] > s[j]){
char t = s[i];s[i] = s[j];s[j] = t;
break;}}
}
int main(){
cout << s<< endl;
for (
int time =
0;time <
119; ++time){
for (
int i =
4; i >
0; --i) {
if (s[i] > s[i -
1]){ sort(i,
4);findALittleBigger(i -
1, i);
break;}}
cout << s<< endl;}}
总结
以上是生活随笔为你收集整理的全排列的生成的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。