全排列的生成

94 篇文章 4 订阅
74 篇文章 1 订阅

将会以生成一个’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;
    }

} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥宅_Sean

公众号“肥宅Sean”欢迎关注

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值