全排列

全排列顾名思义指的是给定一个序列找出其所有的排列方式,例如给定字符串"abc",全排列为:abc、acb、bac、bca、cab、cba。对于不包含相同字符的字符串而言共有n!个排列方式。

解法一、字典序排列算法(非递归)

在字典序排列算法中,排列出现的不同次序是按照从右到左对字符的比较而确定的。例如,我们要对1、2、3、4进行全排列,第一个排列为1234,最后一个排列为4321,也就是说后一个排列要大于前一个排列,那么3142的下一个排列必为3214,这个3214是如何得来的呢?现在我们来看看字典序排列算法的基本思想:

给定已知序列A=P1 P2 P3 P4......Pn(其中1、2、3、4...n为下标)

<1>对输入序列进行升序排列

<2>从序列的右端开始,向左寻找相邻两个字符中第一个比右端小的字符,下标记为i。

<3>在Pi的右边寻找比Pi大的所有字符中最小的一个字符,下标记为j,交换Pi与Pj的值,然后颠倒i右边字符

<4>重复步骤<2>和<3>

例如数字698752431是1~9的一个全排列 ,那么它的下一个排列的计算如下:

我们发现从右端开始,相邻字符中第一个比右端小的字符为2(2 < 4)        698752431

在2的右边所有比2大的字符中最小的一个为3,                                        698752431

交换2和3的位置                                                                                         698753421

对3右边的字符进行颠倒                                                                             698753124

代码如下:

#include <iostream>

using namespace std;

void permutation(int array[], int n);
bool has_next(int array[], int n);
void print_permutation(int array[], int n);

void quick_sort(int array[],int start,int end);
int partion(int array[], int start, int end);
void reserve(int array[], int satrt, int end);

int main()
{
	int array[5] = { 1, 3, 5, 7};
	permutation(array, 4);
}

void permutation(int array[],int n)
{
	/*对输入字符进行升序排序:快速排序*/
	quick_sort(array, 0, n - 1);
	print_permutation(array, n);

	while (has_next(array, n))
		print_permutation(array, n);

}
/*
*/
bool has_next(int array[],int n)
{
	/*寻找相邻两个元素中第一个比右端小的元素*/
	int i;
	for (i = n - 2; i >= 0;i--)
	{
		if (array[i] < array[i+1])
			break;
	}

	if (i < 0)//没有下一个元素
		return false;
	/*寻找array[i]右端比array[i]大的所有元素中最小的元素*/
	int j = i+1,k;
	for (k = i + 2; k < n;k++)
	{
		if (array[k] > array[i] && array[k] < array[j])
			j = k;
	}
	/*交换array[i]与array[j]的位置*/
	int tmp;
	tmp = array[i];
	array[i] = array[j];
	array[j] = tmp;
	/*颠倒array[i]右端的元素*/
	reserve(array, i + 1, n-1);
	return true;
}

void print_permutation(int array[], int n)
{
	for (int i = 0; i < n; i++)
		cout << array[i];
	cout << endl;
		
}

void quick_sort(int array[], int start, int end)
{
	if (start < end)
	{
		int p = partion(array,start,end);
		quick_sort(array, start, p - 1);
		quick_sort(array, p + 1, end);
	}
}

int partion(int array[], int start, int end)
{
	int key = array[end];

	int i, j;
	j = 0;
	int tmp;

	for (i = 0; i < end;i++)
	{
		if (array[i] < key)
		{
			tmp = array[i];
			array[i] = array[j];
			array[j] = tmp;
			j++;
		}
	}
	array[end] = array[j];
	array[j] = key;
	return j;
}

void reserve(int array[], int satrt, int end)
{
	int tmp;
	while (satrt < end)
	{
		tmp = array[satrt];
		array[satrt] = array[end];
		array[end] = tmp;
		satrt++;
		end--;
	}
}
运行结果:


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值