作者:不详 来源:网易博客 酷勤网收集 2007-09-20
好久没有用过C++写程序,突然感觉有点手生。写一个输出字符串全排列的算法,写了一个多小时都没有搞定,不是多几个就是少几个。不知哪里出了问题,干脆先休息一下。过一下来看,发现递归的时候有点逻辑问题。现在贴出来给大家共享一下。速度还算可以。从1-9字符串全排列的排列数耗时(21946982400个)在55sec~65sec之间。5个字符的字符串的全排列耗时0.015sec(120个)。
#include <iostream>
#include <string>
#include <stdlib.h>
#include <time.h>
using namespace std;
string GetInputString ()
{
cout<<"please input the string:"<<endl;
string str;
cin>>str;
return str;
}
string SwapElement (string str, int i,int j);
void ArrangeString (string str);
void OutputArrangeString (string str,int magic)
{
if (str.length () > magic){
//
//排列字符串从magic之后的元素
//
OutputArrangeString (str, magic+1);
for (int i =magic+1; i< str.length (); ++i)
{
//
//交换magic与其后的每一个元素,形成新的字符串进行排序
//
string nextstr = SwapElement(str, magic, i);
cout<<nextstr<<"\t";
if (str.length ()> magic)
{
OutputArrangeString (nextstr,magic+1);
}
}
}
}
void ArrangeString (string str)
{
int magic = 0;
cout<<str<<"\t";
OutputArrangeString (str,magic);
}
inline string SwapElement (string str, int i,int j)
{
return str.substr (0,i)+str.substr (j,1)+str.substr (i,j-i)+str.substr (j+1,str.length()-j);
}
void _tmain()
{
clock_t start,finish;
//ArrangeString ("abcd");
string str = GetInputString ();
start = clock ();
if (str.length ()>1)
{
ArrangeString (str);
}
else
{
cout<<str<<endl;
}
finish=clock ();
double duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "\n consumed time:%10.8f seconds\n", duration );
return ;
}

