已知数N,求1,2,...,N的全排列? 非递归方法 C/C++

 我来答
仙戈雅3n
2014-09-27 · TA获得超过5790个赞
知道大有可为答主
回答量:2398
采纳率:75%
帮助的人:906万
展开全部
#include <iostream>
using namespace std;

#define N 3

// 交换元素
void swap(int *a,int *b){ 
int temp=*a;
*a = *b;
*b = temp;
}

// 字典序全排列算法(非递归版本)
int FullArray(int iArr[], int n,bool *bPoint) 
{
int i,j,k=-1,l;

if(*bPoint){
for(i=0;i<n;i++) cout<<iArr[i];
cout<<endl;
*bPoint=false;
}

for(i=0;i<n-1;i++){  // 找最后的升序的位置
if(iArr[i]<iArr[i+1]) k=i;  
}

if (k>=0){ 
l=-1;

for(i=0;i<n;i++){  // 找到最后一个升序且是最大的数的下标
if(iArr[k]<iArr[i]) l=i;


swap(&iArr[k],&iArr[l]); 

for(i=k+1;i<n;i++)// 将k+1的元素与末尾对调
{
j = n - i + k;
if (i >= j) break; 
swap(&iArr[i], &iArr[j]);
}
}

if (k==-1) return 0;  
for(i=0;i<n;i++) cout<<iArr[i];
cout<<"\n";

return 1; 
}

int main()
{

int iArr[N]={1,2,3};    
bool bFirst=true;

// 开始循环调用字典序算法,直至全排列排列完毕
// 返回0代表排列完毕,返回1代表仍有未排列完的数
while (FullArray(iArr,N,&bFirst)==1);

system("pause");
return 0; 
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式