全排列算法(详解)

思路

运用递归的思路,第一位具有N种情况,接着在第一位确定后,第二位有N-1种情况,再接着第二位确定后,第三位有N-2种情况等…
例:输入1 2 3。
输出1-2-3。
1-3-2。
2-1-3。
2-3-1。
3-1-2。
3-2-1。
规律:有n个数的条件下,每个数都会在第一位(n-1)次。这里用一个for循环就行。
再对他们后面数进行全排列。这就形成递归。

递归函数:

输入:数组,左边,右边。
递归结束的条件:当左边等于右边,完成排列,可以进行其他操作
主体:for(从左到右进行操作){
将list[左边]<–>list[i];
递归(数组,左边+1,右边);
将数组换回来list[左边]<–>list[i];
}

源代码

#include<stdio.h>
#include<stdlib.h>

int input(int[]);
//输入数组,并返回数组元素个数。
int input(int nums[])
{
	int i;
	char c = '0';

	for (i = 0; c != '\n'; i++)
	{
		scanf_s("%d", &nums[i]);
		c = getchar();
	}
	return i;
}

void QuanPaiLie(int[],int,int);
//递归,将最后一个放入前n-1个的全排列。以此类推。
//p,最后一个数。q,“龙头”后的数。
void QuanPaiLie(int nums[],int p,int q)
{
	int i,temp;
	
	//递归的结束条件。最后只有一个数,它的全排列就是他自己。
	if (p == q)
	{
		for (i = 0; i <= q; i++)
		{
			printf("%d-", nums[i]);
		}
		printf("\n");
	}
	else
	{
		//每个数都当一次该全排列的“龙头”。
		for (i = p; i <= q; i++)
		{
			//将那个数交换该排列的到“龙头”。
			temp = nums[i];
			nums[i] = nums[p]; 
			nums[p] = temp;
		
			//将“龙头”的后面再进行全排列
			QuanPaiLie(nums, p + 1, q);

			//用完要换回来。
			temp = nums[i];
			nums[i] = nums[p];
			nums[p] = temp;
		}
	}
}

int main()
{
	int nums[999], num;

	num = input(nums);
	QuanPaiLie(nums,0,num-1);

	system("pause");
	return 0;
}
#include<iostream>
using namespace std;
#include<string>

void fun(string &str, int left, int right){
	if (left == right){
		cout << str << endl;
	}
	else{
		for (int i = left; i <= right; i++){//最后一个元素也要换
			int temp;
			//将那个数交换该排列的到“龙头”。
			temp = str[i];
			str[i] = str[left];
			str[left] = temp;

			//将“龙头”的后面再进行全排列
			fun(str, left + 1, right);

			//用完要换回来。
			temp = str[i];
			str[i] = str[left];
			str[left] = temp;
		}
	}
}

int main(){
	string str;

	cin >> str;

	fun(str, 0, str.length() - 1);

	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值