不明白 vs BLOG


当从不明白走向明白,你会知道什么是艰辛;当从不明白成为明白,你会知道,这一切都很值得!

  VC知识库BLOG :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 登录 ::
  13 随笔 :: 6 文章 :: 95 评论 :: 0 Trackbacks
<2008年2月>
272829303112
3456789
10111213141516
17181920212223
2425262728291
2345678

News

从即日起,本blog将纯粹用于技术方面,所有收藏文章归类到“文章”,原创和翻译归类到“随笔”,其它杂项随笔将收录入我的另一blog:Cursorkey's Room,谢谢!

不明白.2005/3/17.

2005.3.22加入计数器

留言簿(2)

随笔分类

随笔档案

文章分类

文章档案

收藏夹

好友blog链接

技术网址链接

搜索

最新评论

阅读排行榜

评论排行榜

调用C++标准库中的函数实现:
#include <algorithm>
#include <iostream>
#include "windows.h"
using namespace std;
template <typename BidirectionalIterator,typename T>

void permutation(BidirectionalIterator first, BidirectionalIterator last,T s)
{
 sort(first,last);
 do{
  for(BidirectionalIterator i(first);i!=last;++i)
  {
   cout << *i; cout << s;
  }
  cout << endl;
 }while (next_permutation(first, last));
}


int main()
{
 int A[] = {1,2,3,4,5,6,7,8};
 const int N = sizeof(A) / sizeof(int);
 int nTime = GetTickCount();
 permutation(A, A+N ,",");
 nTime = GetTickCount() - nTime;

 return 0;
}

非递归实现:
#include "stdio.h"
#include "iostream.h"
#include "Windows.h"
void func(int n,char * a);
int main()
{
 char arr[]="12345678";
 int nTime = GetTickCount();
 func(8,arr);
 nTime = GetTickCount() - nTime;
 
 return 0;
}

void func(int n,char * a) //an array a[n]
{
 int *i=new int[n];
 int c=0,j;
 i[c]=-1;
 for(;i[0]<n;)
 {
  if(++i[c]<n)
  {
   for(j=0;j<c&&i[j]!=i[c];j++);
   if(j==c)
   {
    if(c+1<n)
    {
     i[++c]=-1;
     //  continue;
    }
    else
    {
     for(int j=0;j<n;j++)
      cout<<a[i[j]]<<",";
     cout<<endl;
    }
   }
  }
  else
   c--;
 }
}

递归算法:
#include <iostream.h>
#include "windows.h"

#define MAXN 100
int a[MAXN];
int flag[MAXN];

void comb(int m, int k, int s)
{
 int i;
 
 if (s >= k)
 {
  for (i = 0; i < k; i++)
   cout << a[i] << " ";
  cout << endl;
 }
 else
 {
  for (i = 1; i <= m; i++)
   if (0 == flag[i])
   {
    flag[i]=1;
    a[s]=i;
    comb(m,k,s+1);
    a[s]=0;
    flag[i]=0;
   }
 }
}

void main()
{
 int i;
 
 for (i=0; i<MAXN; i++)
  a[i]=flag[i]=0;
 
 int nTime = GetTickCount();
 comb(8,8,0);
 //comb(m,n,0) 表示求m个选n个的排列
 nTime = GetTickCount() - nTime;

 return;
}

以8个数的全排列来测试,递归最快,调用库函数最慢。

posted on 2005-04-06 15:13 不明白 阅读(1831) 评论(1)  编辑 收藏

评论

# re: 全排列算法收集 2008-02-14 00:22 Godoor
递归这个不错~~~
感谢了~~~

标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]