C++递归求数组元素全排列--山东大学数据结构实验一

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放在第一位,输出所有排列。以此类推,输出所有排列。下面这个图个人认为比较容易理解该过程。数据结构与算法C++实现教材中的一个图例

下面是具体实现代码(按照实验要求编写)

/*
 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;
}

猜你喜欢

转载自blog.csdn.net/m0_47470899/article/details/109077131