0
点赞
收藏
分享

微信扫一扫

全排列的底层实现(C++)

color_小浣熊 2022-01-20 阅读 59
c++

全排列问题是一种编程中常常出现的一个问题。

今天,我来给你们解析一下全排列的常见实现和底层实现。

首先,全排列的常见实现是用一个叫做next_permatition的封装函数。

废话不多说,直接看代码:

#include<bits/stdc++.h>
#include<algorithm>  
using namespace std;
int main()
{
	int a[11];
	int n;
	cin >> n;
	for(int i=1; i<=n; i++)
		a[i] = i;	
	do
	{
		for(int i=1; i<=n; i++)
			cout << a[i] << " ";
		cout << endl;
	}while(next_permutation(a+1,a+n+1));
	return 0;
}

        这是简易的全排列代码,因为运用了next_permatition这个封装函数,把本来复杂的函数简化了。

        接下来,我们来看一下全排列的底层实现。

#include<bits/stdc++.h>
using namespace std;
int a[100];
int n;
void swap(int a[],int j,int k);
void reverse(int a[],int j);
int find(int b[])
{
	int j,k;
	for(int i=1;i<=n;i++)
	{
		cout<<a[i];
		if(i==n)
		{
			cout<<endl;
		}
	}
	bool flag=1;	
	for(int i=n;i>=2;i--)
	{
		if(a[i-1]<a[i])
		{
			j=i-1;
			break;
		}
		if(i==2)
		{
			flag=0;
		}
	}
	if(flag==0)
	{
		return 0;
	}

	for(int i=n;i>=1;i--)
	{
		if(a[i]>a[j])
		{
			k=i;
			break;
		}
	}
	
	swap(a,j,k);
	reverse(a,j+1);
	return 1;
}

void swap(int a[],int j,int k)
{
	int t;
	t=a[j];
	a[j]=a[k];
	a[k]=t;
}

void reverse(int a[],int j)
{
	int k=n;
	while(j<k)
	{
		swap(a,j,k);
		j++;
		k--;
	 } 
	
}
int main()
{
	
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		a[i]=i; 
	}
	while(1)
	{
		if(find(a)==0)
			break;
	}
	return 0;
}

        希望我的代码能对你们有用,有不对的地方请指出。谢谢。

举报

相关推荐

0 条评论