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

#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;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值