C++递归求数组元素全排列–数据结构实验一
第一篇博客,如果有写的不好的地方欢迎在评论区提出。
参考博文
https://blog.csdn.net/a358463121/article/details/45543879
因为这个代码是按照学校数据结构实验题目要求编写的,其中有很多非必要的代码,大家可以根据自己需求进行更改。
主要实现思路:求n个元素的全排列,可以先依次让每个元素都放在第一位,然后对剩余的n-1个元素进行全排列,利用递归的方法实现,递归到仅有一个元素时,输出全部元素。例如求a,b,c三个元素的全排列,首先把a放在第一位,排列b,c。排列b,c同样运用该思路,把b放在第一位,排列c,仅有一种方法,输出排列1:a,b,c。然后交换b,c,把c放在第一位。输出排列2:a,c,b。a在第一位的所有排列输出完毕,把a,b交换,b放在第一位,输出所有排列。以此类推,输出所有排列。下面这个图个人认为比较容易理解该过程。
下面是具体实现代码(按照实验要求编写)
/*
2020年10月14日15:54:27
1、实验内容及目的:
利用递归求所有元素的全排列
实验要求:
2、输入2-20个大于0的正整数(1、2、3或者100、200、300),输入0作为结束,0不参与排列。
输出这几个整数的全排列,每个数之间用半角“,”隔开,中间不要有空格,每个排列单独一行。
最后输出的一个数字后面不能有“,”。
3、运行样例:
输入:3 2 1 0
输出:
Input
3
2
1
0
Output
3,2,1
3,1,2
2,3,1
2,1,3
1,2,3
1,3,2
end0
*/
#include <iostream>
using namespace std;
void swap(int& a, int& b) //定义交换两个数值的swap函数
{
int temp = a;
a = b;
b = temp;
}
void perm(int list[], int low, int high) //实现list数组中从low到high的全排列
{
if (low == high) //当low==high时,此时list就是其中一个排列,输出list
{
for (int i = 0; i <= low; i++)
{
cout << list[i];
if(i!=low) //当输出的不是最后一个元素时,输出“,”
cout << ",";
}
cout << endl;
}
else //否则递归
{
for (int i = low; i <= high; i++) //每个元素与第一个元素交换
{
swap(list[i], list[low]);
perm(list, low + 1, high); //交换后,得到子序列,用函数perm得到子序列的全排列
swap(list[i], list[low]); //最后,将元素交换回来,复原,然后交换另一个元素
}
}
}
int main()
{
int len = 0;
int *list;
list = new int[20];
cout << "Input" << endl;
cin >> list[len];
while (list[len] != 0) //如果输入“0”则完成元素输入
{
len = len + 1;
cin >> list[len];
}
cout << "Output" << endl;
perm(list, 0, len-1);
cout << "end0";
return 0;
}