欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

全排列的生成

发布时间:2025/4/16 编程问答 43 豆豆
生活随笔 收集整理的这篇文章主要介绍了 全排列的生成 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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

总结

以上是生活随笔为你收集整理的全排列的生成的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。