字典序求全排列的下一种情况
来源:互联网 发布:上海快3遗漏数据查询 编辑:程序博客网 时间:2024/05/18 02:23
假设数组的全排列结果是按升序(或者降序)排列的,对于全排列中的一种情况,求下一个排列情况
如:
输入:a = {5,2,4,3,1}
输出:a = {5,3,1,2,4}
算法思路,从后向前遍历数组,比较相邻的两个元素(i,j,i<j),寻找升序(或者降序)的a[i]<a[j]。如果没找到,说明已经是最后一中情况则终止算法;如果找到,则再次从数组结尾遍历,找到第一个大于(或者小于a[i])的元素a[k](k可能==j),交换a[i]和a[k],在将包括a[j]在内到结尾的数组逆置,即可。
#include<iostream>
#include<stdlib.h>
using namespace std;
template<typename T>
void next_pailie(T *a,T *& next,int len)
{
int i,j;
bool flag;
next = new T[len];
for(i=0;i<len;++i)
next[i] = a[i];
for(i=len-1;i>0;--i)
{
j = i-1;
if(next[j]<next[i])
break;
}
next[i] = next[i]^next[j];
next[j] = next[i]^next[j];
next[i] = next[i]^next[j];
for(i=i+1,j=1;i<len;++i,++j)
{
if(i >= len-j)
break;
next[i] = next[i]^next[len-j];
next[len-j] = next[i]^next[len-j];
next[i] = next[i]^next[len-j];
}
}
int main()
{
int i;
const int len = 5;
char a[len] = {'a' ,'c', 'e','d' ,'b'};
char *b;
next_pailie(a,b,5);
for(i=0;i<len;++i)
cout<<b[i]<<endl;
delete[] b;
system( "pause");
return 0;
}
- 字典序求全排列的下一种情况
- 求全排列的4种情况
- 字典法求全排列(非递归的方法)
- 求全排列的方法
- 算法-把n个数的每一种排列情况都列出来(排列组合)-全排列-字典序算法(一看就懂)
- 一个求全排列的算法
- 求全排列问题的算法
- uva11076求全排列的和
- 求全排列
- 求全排列
- 求全排列
- 求全排列
- 求全排列
- 求全排列
- 求全排列
- 求全排列
- 求全排列
- 求全排列的非递归算法
- STL 函数适配器
- C/C++经典排序算法
- linux编程实例
- hdu 3065 史上最裸 AC 自动机 第三弹
- 指定Toast显示时长
- 字典序求全排列的下一种情况
- 流媒体Live555学习(一)
- linux编程实例1
- 友元与类的提前编译
- Android HAL实例解析
- jsp读取XML
- C语言中的选择判断语句
- linux shell编程2
- 学习 Box2D 个人笔记(五)debugDraw