来源:网易博客   酷勤网收集 2007-09-20

摘要
  一个输出字符串全排列的算法,速度还算可以。从1-9字符串全排列的排列数耗时(21946982400个)在55sec~65sec之间。5个字符的字符串的全排列耗时0.015sec(120个)。

好久没有用过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 ;
}

分类: 算法艺术 设计模式

上一篇:排列组合问题的通用算法   下一篇:SGI 中 STL 基本算法复习