排列组合(STL算法中next_permutation和prev_permutation剖析)
创始人
2025-05-28 16:01:04
0

STL提供了两个用来计算排列组合关系的算法,分别是next_permucation和prev_permutation。解决全排列问题。

首先我们必须了解什么是“下一个”排列组合,什么是“前一个”排列组合。考虑三个字符所组成的序列{a,b, c)。这个序列有六个可能的排列组合: abc,acb,bac,bca,cab,cba。

这些排列组合根据less-than操作符做字典顺序(按照升序排列)的排序。也就是说,abc名列第一,因为每一个元素都小于其后的元素。acb是次一个排列组合,因为它是固定了a(序列内最小元素)之后所做的新组合。同样道理,那些固定b(序列内次小元素)而做的排列组合,在次序上将先于那些固定c而做的排列组合。以bac和 bca为例,bac在 bca之前,因为序列ac小于序列ca。面对bca,我们可以说其前一个排列组合是bac,而其后一个排列组合是cab。序列abc没有“前一个”排列组合,cba没有“后一个”排列组合。

next_permutation

next_permutation ( )会取得〔 first,last)所标示之序列的下一个排列组合。如果没有下一个排列组合,便返回false;否则返回true。

next_permutation 算法过程:

首先,从最尾端开始往前寻找两个相邻元素,令第一元素为*i,第二元素为 *ii,且满足*i< *ii。找到这样一组相邻元素后,再从最尾端开始往前检验,找出第一个大于*i的元素,令为*j,将 i,j元素对调,再将 ii 之后的所有元素颠倒排列。此即所求之“下一个”排列组合。

e.g.以序列{0,1,2,3,4}为例,获得”下一个”排列组合。

输入序列{0,1,2,3,4}

  1. 第一元素为*i == 3,第二元素为 *ii == 4,且满足*i< *ii. 找到这样一组相邻元素(3 4)

  1. 从最尾端开始往前检验,找出第一个大于*i的元素,令为*j == 4

  1. 将 i,j元素对调(*i == 4*j == 3),再将 ii 之后的所有元素颠倒排列

输出“下一个”排列组合{0,1,2,4,3};

e.g.以序列{0,1,2,4,3}为例,获得”下一个”排列组合。

输入序列{0,1,2,4,3}

  1. 第一元素为*i == 2,第二元素为 *ii == 4,且满足*i< *ii. 找到这样一组相邻元素(2 4)

  1. 从最尾端开始往前检验,找出第一个大于*i的元素,令为*j == 3

  1. 将 i,j元素对调(*i == 3 *j == 2),再将 ii 之后的所有元素颠倒排列 (4 2-->2 4)

输出“下一个”排列组合{0,1,3,2,4};

代码测试求全排列问题:

#includeusing namespace std;bool test_next_permutation(char* first, char* last)
{if(first == last) return false;char* i = first;++i;if(i == last) return false;//只有一个元素i = last;                //i指向尾部--i;for(;;){char* ii = i;--i;//以上,以确定一组相邻元素(升序)if(*i < *ii){ //如果前一个小char * j = last; //j指向尾部(尾元素下一个)while(!(*i < *--j));//由尾向前,找到比*i大的元素swap(*i,*j);  //交换i,j元素reverse(ii,last);//将ii后全部元素逆序排序return true;}if(i == first){  //进行首元素reverse(first, last);//全部逆向排序return false;}}
}
int main()
{char s[5] = "0123";do{cout<

prev_permutation

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...