您的位置:首页 > 其它

求一个序列的全部排列

2015-12-18 15:22 369 查看
在C++ STL标准模板库中已经有线程的思想,这样就是介绍STL中的思想。

事实上也能够使用递归的方法解决,兴许问题。STL中的方法也攻克了有反复字符的问题。

思路:

借助了字典序的方法,首先将序列依照升序进行排序(当然也能够使用降序排列。都是一样的道理),将这个序列作为一个字典序的输入序列。从这个字典序怎样变换出下一个字典序列呢?对这个序列从后往前进行搜索。找到一对相邻的升序元素,元素的位置分别为i和j(i<j)。

假设能找到这种一对元素,说明全部的组合还存在,假设没有找到这种一对元素。说明全部的组合都已经找到,算法结束。

假设找到了这种一对元素,那么继续从后往前找到第一个符合条件的元素,使得此元素大于第i个元素。此元素的位置为k,那么交换第i个元素和第k个元素,然后将从第j个元素(包含第j个元素)到最后一个元素进行反转。这样得到的一个序列就是下一个输入的字典序列。

程序代码

#include <stdio.h>

#include <stdlib,h>

#include <string.h>

//反转元素

void reserve(int begin,int end.char* str)

{

while(begin < end)

{

char temp = str[begin];

str[begin]  = str[end];

str[end]   = temp;

begin++;

end++;

]

]

//交换两个元素

void swap(char* src,char* dest)

{

char temp = *src;

*src = *dest;

*dest = temp;

}

void next_premutaion(char* str)

{

int i,j,k;

int len = strlen(str);

// 作为一个新的输入序列 首先输出

printf("%s\r\n",str);

//从后往前找到一对相邻的升序元素(i<j)

for(j=len-1,i=j-1;j>=0;i--,j--)

if(str[i] < str[j])

break;

//说明全部的组合都已经结束

if(i == -1)

return;

//从后往前找一个元素大于i

for(k=len-1,k>=0;k--)

if(str[k] > str[i])

break;

swap(&str[i],&str[k]);

reserve(j,len-1,str);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: