是否有任何排列算法?

Posted

技术标签:

【中文标题】是否有任何排列算法?【英文标题】:Is there any algorithm for permutations? 【发布时间】:2012-07-20 19:30:17 【问题描述】:

我需要一种算法或伪代码来生成排列。假设,我得到了两个数字,分别表示字母的数量和排列的数量。

我必须写出 26 个英文字母的所有排列。我已经写了一个代码,但是有一个问题。问题在于输入 3 和 6,我的代码生成 ABC、ACB、BAC、BCA、CBA、CAB。但我需要它来生成 ABC、ACB、BAC、BCA、CAB、CBA

#include<iostream>

using namespace std;

int c, K, N;

void permute(char a[], int i);
void swap(char* x, char* y);

int main(void)

    int t;
    char a[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    cin >> t;
    for(int i=1; i<=t; i++)
    
        cin >> N >> K;//N denotes number of letters and K denotes number of permutations
        cout << "Case " << i <<":" << endl;
        c=0;
        permute(a,0);
    
    return 0;


void permute(char* a, int i)
 
    if(i==N-1)
    
        for(int j=0; j<N; j++)
            cout << a[j];
        cout << endl;
        c++;
        return;
    
    else
    
        for(int j=i; j<N && c<K; j++)
        
            swap(&a[i],&a[j]);
            permute(a,i+1);
            swap(&a[i],&a[j]);
        
    
    return;


void swap(char* x, char* y)

    char temp;
    temp=*x;
    *x=*y;
    *y=temp;
    return;

【问题讨论】:

结果的顺序重要吗? 是的,顺序很重要。 【参考方案1】:

std::next_permutation函数

【讨论】:

【参考方案2】:

你可以试试这个。我使用c编程。您可以轻松地将此代码转换为 c++。我的代码是::

 #include<stdio.h>
 #include<stdlib.h>
 #include<ctype.h>

 int com(const void *a,const void *b)   
    char c,d;
    c=*((char *)a);
    d=*((char *)b);
return (c-d);
 

int main()   
   char a[600];
   int i,j,l,flag=0,count=0,cs,c;
   scanf("%d",&cs);
   getchar();

   for(;cs;cs--)  
    gets(a);
    for(l=0;a[l];l++);
    qsort(a,l,sizeof(char),com);
    puts(a);
    if(a[0]==0)
        break;
    while(1) 
        for(i=l-1;a[i]>=a[i+1]&&i;i--);
        if(a[i]>=a[i+1])
            break;
        for(j=l-1;a[i]>=a[j];j--);
        c=a[i];
        a[i]=a[j];
        a[j]=c;
        for(j=i+1,i=l-1;i>j;i--,j++)
        
            c=a[i];
            a[i]=a[j];
            a[j]=c;
        
        puts(a);
      
   
   return 0;
 

【讨论】:

【参考方案3】:
#include <algorithm>
#include <iostream>
#include <ostream>
#include <vector>
#include <iterator>

using namespace std;

void print(vector<char> &v)
    copy(v.begin(), v.end(), ostream_iterator<char>(cout));
    cout << endl;


void permute(vector<char> &v, int k)
    int c=0;
    do 
        print(v);
        ++c;
    while(c < k && next_permutation(v.begin(), v.end()));


int main()
    char a[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int t;

    cout << "Input number of trials:";
    cin >> t;
    for(int i=1; i<=t; ++i)
        int n, k;
        cout << "letter length:";
        cin >> n;
        cout << "permutation length:";
        cin >> k;
        vector<char> v(&a[0], &a[n]);
        cout << "Case " << i <<":" << endl;
        permute(v, k);
    

【讨论】:

非常感谢。感谢你的帮助。我终于解决了问题【参考方案4】:
#include <algorithm>
#include <iostream>
#include <ostream>
#include <vector>
#include <iterator>

using namespace std;

vector<int> n2pat(int n, int len)
    vector<int> v;

    for(int i=1;i<=len;++i)
        v.push_back(n % i);
        n /= i;
    
    reverse(v.begin(), v.end());
    return v;


template<typename T>
vector<T> pat2perm(vector<T> v, vector<int> &pat)
    vector<T> perm;
    for(vector<int>::const_iterator i=pat.begin();i!=pat.end();++i)
        perm.push_back(v[*i]);
        v.erase(v.begin()+ *i);
    
    return perm;


template<typename T>
void print(vector<T> &v)
    copy(v.begin(), v.end(), ostream_iterator<T>(cout));
    cout << endl;


template<typename T>
void permute(vector<T> &v, int k)
    int size=v.size();
    for(int c=0;c<k;++c)
        vector<int> pat = n2pat(c, size);
        vector<T> perm = pat2perm(v, pat);
        print<T>(perm);
    


int main()
    char a[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int t;

    cout << "Input number of trials:";
    cin >> t;
    for(int i=1; i<=t; ++i)
        int n, k;
        cout << "letter length:";
        cin >> n;
        cout << "permutation length:";
        cin >> k;
        vector<char> v(&a[0], &a[n]);
        cout << "Case " << i <<":" << endl;
        permute(v, k);
    

【讨论】:

您能否在此处为您的两个示例添加一些介绍性材料?目前尚不清楚它们实际上显示的是什么。

以上是关于是否有任何排列算法?的主要内容,如果未能解决你的问题,请参考以下文章

没有重复的排列算法?

有重复元素的排列问题

显示每个排列的算法(尤其是对于 c++)

生成排列的算法的复杂性

swift 验证字符串是否具有O(n)中的回文的任何排列

无连续字母的排列数相同