例1:排列产生算法
题目:给定n个自然数{0,1,…,n-1}的集合,设计一个算法,输出该集合所有可能的排列
思路:如n=5,分别求出以0,1,2,3,4开头剩下数字的全排列,一直到化简为一个数字
#include<iostream>
using namespace std;
void Perm(int a[], int k, int n)
{
if (k == n - 1) { //化简为一个数字,一次排列结束,输出
for (int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
}
else
for (int i = k; i < n; i++) { //k是开头的第一个数
int t = a[k]; a[k] = a[i]; a[i] = t; //分别以集合中的每个数开头
Perm(a, k + 1, n);
t = a[k]; a[k] = a[i]; a[i] = t; //一轮结束后复原
}
}
int main()
{
int a[10] = { 0 };
int i;
for (i = 0; i < 10; i++) {
a[i] = i;
}
Perm(a, 0, 3);
}