我們有一個數組,int array={1,2,3};
顯示所有可能的排列,這將是如何打印數組元素的所有排列efficienctly用最少的代碼
{1,3,2} ,
{2,1,3} ,
{2,3,1} ,
{3,1,2} ,
{3,2,1} etc.
所有n!
可能性。
我知道這兩種方式直接遞歸和回溯。
有沒有更好的方法來做同樣的事情?
謝謝。
我們有一個數組,int array={1,2,3};
顯示所有可能的排列,這將是如何打印數組元素的所有排列efficienctly用最少的代碼
{1,3,2} ,
{2,1,3} ,
{2,3,1} ,
{3,1,2} ,
{3,2,1} etc.
所有n!
可能性。
我知道這兩種方式直接遞歸和回溯。
有沒有更好的方法來做同樣的事情?
謝謝。
您可以使用描述的方法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
的implmentation。您可以偷看內部stl代碼並進行必要的更改以將其移植到C
代碼。
是的,謝謝。我還沒有15分,所以無法+1,但我開始使用與上述相同的代碼,但我想要的是是否可以減少它?或者是否存在對同一個In C或至少是同一個的算法概述的任何聲明方式。 – Pushpa
@Pushpa嘗試理解代碼背後的邏輯,並嘗試通過每次更改1來減少它,並重新編譯並驗證結果。您應該能夠在一段時間內將其降低到您的要求。 –
如果使用C++的STL庫,會出現問題嗎? –
謝謝。哦!需要那麼糟糕,因爲我想用這個概念解決另一個問題。好的會嘗試使用正常的遞歸。 – Pushpa
如果你想要一個迭代的方法,你可以看到:http://stackoverflow.com/questions/6716847/converting-recursive-permutation-generator-to-iterative –