全排列的生成

来源:互联网 发布:linux 内核 视频 编辑:程序博客网 时间:2024/05/16 15:53

将会以生成一个’ABCDE’的一个全排列为例
全排列的生成,就是从后面数,找到第一符合顺序的(如: ‘D’ < ‘E’)这样的信号。就要开始处理。
处理方法是:
将找到这个符合顺序的位置(如:’B’ < ‘C’),那么就把’C’后面(包括’C’在内的字符串生成一个排好顺序(恢复熵值)),再从左边走,找到第一个比’B’大的字符,那么就把这两个字符的位置交换。

其实本质上是将比’B’大的数中最小的那个给拿出来,然后交换,再排好序,不过根据这样的算法,实现了同样的效果。
这是这个代码跟大多的全排列生成的不一样的地方
代码如下:

#include <iostream>using namespace std;// 用于生成全排列A-Estring 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;    }} 
原创粉丝点击