C ++は配列要素の完全な配置を再帰的に見つけます-データ構造実験1
最初のブログで、悪い文章があればコメント欄に投稿してください。
参照ブログ投稿
https://blog.csdn.net/a358463121/article/details/45543879
このコードは学校のデータ構造実験の要件に従って記述されているため、必須ではないコードが多数あり、必要に応じて変更できます。
主な実現アイデア:n個の要素の完全な配置を見つけるには、最初に各要素を順番に配置し、次に再帰的な方法を使用して残りのn-1個の要素をすべて配置し、再帰的に1つのInのみに配置します。要素の場合、すべての要素が出力されます。たとえば、3つの要素a、b、およびcの完全な配置を見つけるには、最初にaを最初に配置し、bとcを配置します。アレンジメントb、cは同じアイデアを使用し、最初にbをアレンジメントcに置きます。アレンジメント1を出力する方法は1つだけです:a、b、c。次に、cを最初に置いてbと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;
}