你猜我有多动心 2016-11-30 05:05 采纳率: 100%
浏览 3443
已采纳

c语言字典序全排列高效算法(非递归)

#include
void swap(int a[100],int j,int k)
{
int temp;
temp=a[j];
a[j]=a[k];
a[k]=temp;
}
void reverse(int a[100],int j,int n)
{ int i,y;
for(i=j+1,y=0;i {swap(a,i,n-y);}
}
void print(int a[100],int n)
{
int i;
for(i=1;i {
printf("%d ",a[i]);
}
printf("\n");
}
int fac(int n)
{
int anw;
if(n==1||n==0)
anw=1;
else
anw=n*fac(n-1);
return anw;
}
void fin(int a[100],int n)
{
int i,j,k;
for(i=n-1;i>=1;i--)
{
if(a[i]<a[i+1])
{j=i;break;}
}
for(i=0;i<n;i++)
{
if(a[j]<a[n-i])
{k=n-i;break;}
}
swap(a,j,k);
reverse(a,j,n);
print(a,n);
}
int main()
{
int i,n,m,y;
int a[100];
scanf("%d",&n);
for(i=1;i<=n;i++)
a[i]=i;
print(a,n);
for(m=1;m<=fac(n)-1;m++)
{fin(a,n);}

return 0;

}

这个代码会超时,想知道怎么才能优化?
这个代码有写错的地方吗?还是只是因为算法太低效才会超时?

  • 写回答

8条回答 默认 最新

  • zjck1995 2016-11-30 10:39
    关注
    #include<stdio.h>
    using namespace std;
    const int N =105;
    int n,m;
    int a[N];
    void out(){
        for(int i=1;i<=n;i++) printf("%d",a[i]);
        puts("");
    }
    void swap(int& a,int& b){
        int tmp = a;a=b;b=tmp;
    }
    void rev(int left,int right){
        while(left<=right){
            swap(a[left],a[right]);
            left++,right--;
        }
    }
    bool change(){
        int j=n-1;
        for(;j>=1;j--){
            if(a[j]<a[j+1]) break;
        }
        if(j<1) return false;
        int k=n;
        while(a[k]<a[j]) k--;
        swap(a[k],a[j]);
        rev(j+1,n);
        return true;
    }
    int main()
    {
        while(scanf("%d",&n)==1){
            for(int i=1;i<=n;i++) a[i]=i;
            out();
            while(change()) out();
        }
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。