将会以生成一个’ABCDE’的一个全排列为例
全排列的生成,就是从后面数,找到第一符合顺序的(如: ‘D’ < ‘E’)这样的信号。就要开始处理。
处理方法是:
将找到这个符合顺序的位置(如:’B’ < ‘C’),那么就把’C’后面(包括’C’在内的字符串生成一个排好顺序(恢复熵值)),再从左边走,找到第一个比’B’大的字符,那么就把这两个字符的位置交换。
其实本质上是将比’B’大的数中最小的那个给拿出来,然后交换,再排好序,不过根据这样的算法,实现了同样的效果。
这是这个代码跟大多的全排列生成的不一样的地方
代码如下:
#include <iostream>
using namespace std;
// 用于生成全排列A-E
string s = "ABCDE";
void sort(int start,int end){ // 采用easysort
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){ //end 默认为4就不用担心了
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){//进行199次筛选就好了
for (int i = 4; i > 0; --i) {
if (s[i] > s[i - 1]){ //出现顺序数,就将s[i - 1]放到后面来,并且用s[i-1]中比s[i - 1]大的最小那个数放到这个位置上
sort(i, 4);
findALittleBigger(i - 1, i);
break;
}
}
cout << s<< endl;
}
}