zoukankan      html  css  js  c++  java
  • N个数全排列的非递归算法

    //N个数全排列的非递归算法   
    #include"stdio.h"   
    void swap(int &a, int &b)   
    {   
        int temp;   
        temp = a;   
        a = b;   
        b = temp;   
    }   
    /*   
    根据当前的排列p,计算下一个排列。   
    原则是从1234–>4321,若p已经是最后一个排列,传回false,否则传回true。   
    p是一个n维向量。   
    */   
    bool nextPermutation(int *p, int n)   
    {   
        int last=n-1;   
        int i,j,k;   
        //从后向前查找,看有没有后面的数大于前面的数的情况,若有则停在后一个数的位置。   
        i=last;   
        while(i>0&&p[i]<p[i-1])   
            i--;   
        //若没有后面的数大于前面的数的情况,说明已经到了最后一个排列,返回false。   
        if(i==0)   
            return false;   
        //从后查到i,查找大于p[i - 1]的最小的数,记入k   
        k=i;   
        for(j=last;j>=i;j--)   
            if(p[j]>p[i-1]&&p[j]<p[k])   
                k =j;   
            //交换p[k]和p[i - 1]   
            swap(p[k],p[i-1]);   
            //倒置p[last]到p[i]   
            for (j =last,k =i;j>k;j--,k++)   
                swap(p[j],p[k]);   
            return true;   
    }   
    //显示一个排列   
    void showPermutation(int *p, int n)   
    {   
        for(int i=0;i<n;i++)   
            printf("%d ",p[i]);   
        printf("
    ");  
    }   
    int main(int argc, char *argv[])   
    {   
        int n;   
        int *p;   
        scanf("%d",&n);   
        p = new int[n];   
        for (int i = 0; i < n; i++)   
            p[i] = i + 1;   
        showPermutation(p, n);   
        while(nextPermutation(p, n))   
        {   
            showPermutation(p, n);   
        }   
        //delete[] p;   
        return 0;   
    }  
     
    
    //本文出自 “阿凡达” 博客,请务必保留此出处
    //http://shamrock.blog.51cto.com/2079212/702551
    积跬步以致千里,积小流以成江海。
    2016年5月之前的博文发布于51cto,链接地址:shamrock.blog.51cto.com
    2016年5月之后博文发布与cnblogs上。
    Github地址 https://github.com/umgsai
    Keep moving~!!!
  • 相关阅读:
    分布式事务--AT+TCC
    Java基础面试题
    JVM问题
    集合问题
    线程问题
    微服务面试题
    【入职准备】安装STS以及整合maven
    事务----四大特性
    html小知识--创建表单
    通过css润色html表格
  • 原文地址:https://www.cnblogs.com/umgsai/p/3908238.html
Copyright © 2011-2022 走看看