全排列的知识点

首语

首先要知道,什么是全排列
百度百科上定义:

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
公式:全排列数f(n)=n!(定义0!=1)

基本操作步骤

最基本的全排列

看了b站up 的视频,了解大概基础
我手动敲一下这个代码哈

#include<stdio.h>
void swap(int A[],int i,int j)
{
int temp=A[i];
A[i]=A[j];
A[j]=temp;
}
void printArray(int A[],int n)
{
int i;
for(i=0;i<n;i++)
	printf("%d ",A[i]);
printf("\n");
}
void perm(int A[],int p,int q)
{
if(p==q)
{
printArray(A,q+1);
}
else{
	int i;
	for(i=p;i<=q;i++)
	{
	swap(A,p,i);
	perm(A,p+1,q);
	swap(A,p,i);
	}
}
}
int main()
{
int A[3]={1,2,3};
perm(A,0,2);

}

如果想要去重

思路:在进行交换前进行判断,若是重复就跳过这种情况。(另写一段代码来操作)
代码:

#include<stdio.h>
void swap(int A[],int i,int j)
{
int temp=A[i];
A[i]=A[j];
A[j]=temp;
}
void printArray(int A[],int n)
{
int i;
for(i=0;i<n;i++)
	printf("%d ",A[i]);
printf("\n");
}
bool ifsame(int A[],int p,int q)
{
	for(int i=p;i<q;i++)
		if(A[i]==A[q])
			return false;
	return true;
}
void perm(int A[],int p,int q)
{
if(p==q)
{
printArray(A,q+1);
}
else{
	int i;
	for(i=p;i<=q;i++)
	if(ifsame(A,p,i))
	{
	swap(A,p,i);
	perm(A,p+1,q);
	swap(A,p,i);
	}
}
}
int main()
{
int A[4]={1,2,3,3};
perm(A,0,2);

}

算法分类

全排列算法有四种
分别为:

  • 字典序法
  • 递增进位制数法
  • 递减进位制数法
  • 邻位对换法

用STL中的函数来进行全排列

这是另一个博主的内容

上一篇:leetcode-1734 解码异或后的排列


下一篇:ManualResetEvent、AutoResetEvent和Mutex