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;
}
}
}
#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;
}
}
}
相关文章推荐
- STL快速全排列函数next_permutation与pre_permutation
- poj3187(next_permutation实现全排列+杨辉三角)
- stl库之next_permutation实现全排列(二)
- next-permutation与prev-permutation及递归实现全排列
- 全排列(一)next_permutation方式实现
- 1384 全排列 next_permutation()函数
- 详解STL中next_permutation()函数实现
- 方格填数-用next_permutation()全排列函数做的
- 关于全排列 next_permutation() 函数的用法
- STL实现全排列 next_permutation
- next_permutation()函数实现全排序
- STL之全排列next_permutation()函数的用法
- 九度OJ 1120 全排列 -- 实现C++STL中next_permutation()
- 关于全排列 next_permutation() 函数的用法
- 九度OJ 1120 全排列 -- 实现C++STL中next_permutation()
- 全排列,next-permutation 简单实现
- 用STL的next_permutation算法实现全排列
- 关于全排列 next_permutation() 函数的用法
- STL实现全排列 next_permutation
- C++实现全排列(调用next_permutation)