如何使用最少的代码有效地打印所有数组元素的排列

时间:2014-12-22 05:45:42

标签: c algorithm permutation combinatorics

我们有一个数组,int array={1,2,3};
显示所有可能的排列

{1,3,2} ,
{2,1,3} , 
{2,3,1} , 
{3,1,2} , 
{3,2,1} etc.

所有n!种可能性。

我也知道这两种方式都是直接递归和回溯 有没有更好的方法来做同样的事情?
谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用here所述的方法。

您可以根据需要稍微修改他的算法:

#include <stdio.h>


void print(const int *v, const int size)
{
  if (v != 0) {
    for (int i = 0; i < size; i++) {
      printf("%c", i ? ',':'{');
      printf("%d", v[i] );
    }
    printf("}\n");
  }
} // print


void permute(int *v, const int start, const int n)
{  
  if (start == n-1) {
    print(v, n);
  }
  else {
    for (int i = start; i < n; i++) {
      int tmp = v[i];

      v[i] = v[start];
      v[start] = tmp;
      permute(v, start+1, n);
      v[start] = v[i];
      v[i] = tmp;
    }
  }
}


int main(void)
{
  int v[] = {1, 2, 3};
  permute(v, 0, sizeof(v)/sizeof(int));
}

Live example here

如其他答案所述,C ++ stl库提供了next_permutation的实现。您可以在stl代码中窥视并进行必要的更改以将其移植到C代码。