题目:给出一个数组,输出全部元素所有的排列结果
一、递归方法
数学思想:全排列个数为n的阶乘,数学记为n!即 n*(n-1)*(n-2)*...*1
代码实现逻辑:首先从数组全部元素中的选择一个作为最终排列完数组的第一个元素;然后再从剩下的n-1个元素中选出一个作为最终排列完数组的第二个元素(也就是数组剩下元素中的第一个元素),依次类推,直到数组中只剩下最后一个元素,则排列完毕
最终实现代码如下
#include <iostream>
using namespace std;
//全排列的递归算法
void swap ( int a, int b) {
a= a+b;
b = a-b;
a = a-b;
}
void printfArr(char * array, int count) {
for(int i=0; i<=count; i++) {
cout<<array[i];
}
cout<<endl;
}
void permutation(char * array, int start, int end)
{
if(start>=end) //递归结束,打印当前这次全排列结果,返回。
{
printfArr(array, end);
} else {
for(int j=start; j<=end; j++)
{
swap(array[start],array[j]); //交换元素,使每一个元素都有放在当前数组余下所有元素的第一位的机会。
permutation(array,start+1,end); //递归调用
swap(array[start],array[j]); //恢复原始的数组array,不影响下次递归调用。
}
}
}
int main()
{
char array[]="abcd";
cout<<"所有全排列的结果为:"<<endl;
permutation(array,0,3);
return 0;
}
二、站在开发者角度,基本上每种语言都会有封装好的方法供开发者使用,C++ STL库中的next_permutation()函数就可以直接拿来使用
void permutation(char * array, int len)
{
do {
printfArr(array, len - 1);
} while(next_permutation(array, array + len));
}
网友评论