您的位置:首页 > 其它

next_permutation()函数 (数字1~10内实现全排列)

2018-03-31 16:37 471 查看
#include<stdio.h>
#include<algorithm>using namespace std;
int a[4]={1,2,3,4};
char b[4]={'a','b','c','d'};
int main(void){
    sort(a,a+4); /*若是无序数列,用sort()排序*/
    do{
        for(int i=0;i<4;i++){
            printf("%d ",a[i]);
        }
        printf("\n");
    }while(next_permutation(a,a+4));
    do{
        for(int i=0;i<=4;i++){
            printf("%c ",b[i]);
        }
        printf("\n");
    }while(next_permutation(b,b+4));
    return 0;
}
/*next_permutation函数将按字母表顺序生成给定序列的下一个较大的排列,直到整个序列为降序为止,当整个序列为降序之后
 next_permutation()会返回false
prev_permutation函数与之相反,是生成给定序列的上一个较小的排列。二者原理相同,仅遍例顺序相反*/
算法思想:
1.首先从最尾端开始往前寻找两个相邻元素,令第一元素为*i,第二元素为*ii,且满足*i<*ii。
2.找到这样一组相邻元素后,再从最尾端开始往前检验,找出第一个大于*i的元素,令为*j,将i,j元素对调(swap)。
3.再将ii之后的所有元素颠倒(reverse)排序。源代码:
template<calss BidrectionalIterator>
bool next_permutation(BidrectionalIterator first,BidrectionalIterator last)
{
    if(first == lase) return false; /* 空区间 */
    BidrectionalIterator i = first;
    ++i;
    if(i == last) return false;  /* 只有一个元素 */
    i = last;                    /* i指向尾端 */
    --i;
    for(;;)
    {
        BidrectionalIterator ii = i;
        --i;
        /* 以上锁定一组(两个)相邻元素 */
        if(*i < *ii)           /* 如果前一个元素小于后一个元素 */
        {
            BidrectionalIterator j = last; /* 令j指向尾端 */
            while(!(*i < *--j));     /* 由尾端往前找,直到遇到比*i大的元素 */
            iter_swap(i,j);          /* 交换i,j */
            reverse(ii,last);        /* 将ii之后的元素全部逆序重排 */
            return true;
        }
        if(i == first)       /* 进行至最前面了 */
        {
            reverse(first,last);    /* 全部逆序重排 */
            return false;
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: