我们有一个数组,int array={1,2,3};
显示所有可能的排列
{1,3,2} ,
{2,1,3} ,
{2,3,1} ,
{3,1,2} ,
{3,2,1} etc.
所有n!
种可能性。
我也知道这两种方式都是直接递归和回溯
有没有更好的方法来做同样的事情?
谢谢。
答案 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));
}
如其他答案所述,C ++ stl库提供了next_permutation
的实现。您可以在stl代码中窥视并进行必要的更改以将其移植到C
代码。