全排列问题
算法解释:
画出树形结构如下:
实现思路:
可以用交换来实现–定义k,m 指数组的下标 当k=m的时候说明局部规模为1,即排列完成。
所以给一个j 进行排列的时候 将k和j指向的值进行交换
首先是1和1交换 然后对2,3进行全排列
j++ k和j交换 即1和2交换 那么排列的数据就是1,3
以此类推
代码实现:
void swap(int &a, int &b)
{
int tmp = a;
a = b;
b = tmp;
}
void Perm(int *ar,int k,int m)//为啥是*ar
{
if (k == m)
{
for (int i = 0; i < =m; ++i)
{
cout << ar[i] << " ";
}
cout << endl;
}
else
{
for (int j = k; j <= m; ++j)
{
swap(ar[k], ar[j]);
Perm(ar, k + 1, m);
swap(ar[k], ar[j]);
}
}
}
int main()
{
int ar[] = { 1,2,3 };
int n = sizeof(ar) / sizeof(ar[0]);
Perm(ar, 0, n - 1);
return 0;
}
k和m不相等 不相等的话把k给j交换 相等的话说明排列好了 直接输出即可