C++:字母按字典序的全排列

要点:相比于普通的递归全排列,按字典排序的全排列需要用到排序函数(下面代码中的Sort函数),要为字符先排好序(按ASCLL值),再进行递归排列。

普通的递归全排列(可与本文的代码比较来看):https://blog.csdn.net/qq_40760732/article/details/100098306

注意:Perm(char list[],int p,int q)做的是数组list[]中下标值p与q之间所有元素的全排列,再Perm函数中调用Sort(list,p,q+1)做的是下标值为p到q+1之间元素的全排列,每次递归p值都会加一,即每次都会对除下标值为零之外的元素进行排序。

#include<iostream>
using namespace std;
void Sort(char a[], int g, int b);  //声明排序函数,对下标值为g到b之间的元素进行排序
void Swap(char& a, char& b)
{
	char tem;
	tem = a;
	a = b;
	b = tem;
}

void Perm(char list[], int p, int q)
{
	if (p == q)
	{
		for (int i = 0; i <= q; i++)
			cout << list[i];
		cout << ' ';
	}
	else
	{
		for (int i = p; i <= q; i++)
		{
			Sort(list,p, q + 1);     //每次递归都要排序
			Swap(list[i], list[p]);       
			Perm(list, p + 1, q);
			Swap(list[i], list[p]);
		}
	}
}

//排序函数(选择排序法)
void Sort(char a[],int g,int b)
{
	char tem;
	int m,n;
	for (int i = g; i < b; i++)
	{
		m = i;
		for (int j = i + 1; j < b; j++)
		{
			if (a[m] > a[j])
			{
				m = j;
			}

		}
		if (m != i)
		{
			tem = a[m];
			a[m] = a[i];
			a[i] = tem;
		}
	}
}


int main()
{
	int i;
	char* a = new char[20];
	cin.getline(a, 20,'\n');
	for (i = 0; a[i] != ','; i++)
		i = i;
	
	Sort(a,0, i);
	Perm(a, 0, i-1);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值