当前位置: 首页 > 知识库问答 >
问题:

排列有什么算法吗?

欧阳勇军
2023-03-14

我需要一个生成置换的算法或伪代码。假设给我两个数字,表示字母的数量和排列的数量。

我必须编写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;
}

共有3个答案

颜新
2023-03-14
#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);
    }
}
楚灿
2023-03-14

你可以试试这个。我使用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;
 }
郑声
2023-03-14

查看std::next\u permutation函数

 类似资料:
  • 上一章介绍了很多排序算法, 插入排序、选择排序、 归并排序等等,这些算法都属于 内部排序算法,即排序的整个过程只是在内存中完成。而当待排序的文件比内存的可使用容量还大时,文件无法一次性放到内存中进行排序,需要借助于外部存储器(例如硬盘、U盘、光盘),这时就需要用到本章介绍的 外部排序算法来解决。 外部排序算法由两个阶段构成: 按照内存大小,将大文件分成若干长度为 l 的子文件(l 应小于内存的可使

  • 有一个集合,例如(1,4,2,5,7,6,9,8,3)。我们通过以下方式计算它的(FD):。inputArray是原始集。例如大小写为(1,4,2,5,7,6,9,8,3)。first差异是从inputArray创建的,方法如下:(inputArray的第二个元素)-(inputArray的第一个元素)等等。 所以给定集合的FD是(3,-2,3,2,-1,3,-1,-5)。任务是找到给定集合的多个

  • 有些答案最初有这样的排序算法: 请注意,和都是全范围的,因此可以比大,也可以比小,所以它可以使成对的顺序正确,也可以使成对的顺序错误(实际上这两种顺序都正确!)。我认为这是一个错误(作者后来称之为错误),这会混淆数组,但它看起来排序正确。不过,原因并不明显。但是代码的简单性(范围很广,没有像冒泡排序那样的)使它变得有趣。 正确吗?如果是这样,它为什么起作用?它有名字吗? 带测试的Python实现:

  • 我编写了一个程序,解决了24的通用版本(为好奇的人提供链接)。也就是说,给定一组数,有没有办法对它们执行二进制运算,以便它们计算到目标数。 为此,我将可能的表达式视为由或组成的char数组,其中是值的占位符,是操作的占位符。请注意,如果有值,则必须有操作。 程序当前的工作方式是按字典顺序检查的每个排列,并查看前缀表达式是否有效。例如,当时,以下表达式被认为是有效的: 以下表达式无效: 我的问题是,

  • 主要内容:算法是什么,伪代码描述算法要想成为一名合格的程序员,除了至少掌握一门编程语言,更重要的是多动手实践,积累足够的代码量,提升自己“遇到问题,解决问题”的能力。任何一门编程语言的学习,本质就是学习它规定的语法,整个过程只能死记硬背,几乎没有捷径。但是,提高“解决问题”的能力是有捷径可寻的,比如掌握一些算法。 提到“算法”,很多人都觉得它高深莫测、晦涩难懂。事实上的确存在一些算法,学员必须具备优秀的数学基础和编程能力才能驾驭。但

  • 本文向大家介绍你对微信排版有什么看法?相关面试题,主要包含被问及你对微信排版有什么看法?时的应答技巧和注意事项,需要的朋友参考一下 最好的方式是自己在微信推送的文章递给HR看,排版能力以及内容输出能力一目了然。 当然,你还可以谈谈相关看法。 排版参数(字号/行间距/字间距/页边距等)统一规划(我的排版参数是字号14px,字间距1.0px,两端缩进尺寸1px,行间距1.75px,供参考) 设计统一的