生活随笔
收集整理的這篇文章主要介紹了
全排列的生成
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
將會(huì)以生成一個(gè)’ABCDE’的一個(gè)全排列為例
全排列的生成,就是從后面數(shù),找到第一符合順序的(如: ‘D’ < ‘E’)這樣的信號(hào)。就要開(kāi)始處理。
處理方法是:
將找到這個(gè)符合順序的位置(如:’B’ < ‘C’),那么就把’C’后面(包括’C’在內(nèi)的字符串生成一個(gè)排好順序(恢復(fù)熵值)),再?gòu)淖筮呑?#xff0c;找到第一個(gè)比’B’大的字符,那么就把這兩個(gè)字符的位置交換。
其實(shí)本質(zhì)上是將比’B’大的數(shù)中最小的那個(gè)給拿出來(lái),然后交換,再排好序,不過(guò)根據(jù)這樣的算法,實(shí)現(xiàn)了同樣的效果。
這是這個(gè)代碼跟大多的全排列生成的不一樣的地方
代碼如下:
#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;}}
總結(jié)
以上是生活随笔為你收集整理的全排列的生成的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。