打印一个数组的全排列,要求非递归。
方法一:
void permutation(int a[], int n)
{
stack<int> buf;
bool needAdd = false;
buf.push(0);
buf.push(0);
while (!buf.empty())
{
if (buf.top() == n-1)
{
for (int i = 0; i < n; i++)
{
cout << a[i];
}
cout << endl;
}
int start = buf.top();
buf.pop();
int pos = buf.top();
buf.pop();
if (pos == n-1)
{
needAdd = true;
swap(a[start], a[pos]);
continue;
}
swap(a[start], a[pos]);
if (needAdd)
{
pos++;
swap(a[start], a[pos]);
needAdd = false;
}
buf.push(pos);
buf.push(start);
buf.push(start+1);
buf.push(start+1);
}
}
int main(int argc, char *argv[])
{
int a[] = {1, 2, 3, 4};
int aSize = sizeof(a)/sizeof(int);
permutation(a, aSize);
return 0;
}
方法二:
void permutation(int a[], int n)
{
stack<int> buf;
bool flag[n];
memset(flag, true, sizeof(flag));
vector<int> result;
bool needPop = false;
int begin = 0;
flag[0] = false;
buf.push(0);
result.push_back(a[0]);
while (!buf.empty())
{
if (buf.size() == n)
{
for (int i = 0; i < n; i++)
{
cout << result[i];
}
cout << endl;
flag[buf.top()] = true;
buf.pop();
result.pop_back();
needPop = true;
}
if (needPop)
{
int index = buf.top();
flag[index] = true;
buf.pop();
result.pop_back();
begin = index+1;
}
else
{
begin = 0;
}
for (int i = begin; i < n; i++)
{
if (flag[i])
{
buf.push(i);
result.push_back(a[i]);
flag[i] = false;
needPop = false;
break;
}
}
}
}