| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 737 人关注过本帖
标题:这是我写的一个集产生随机字母,二分技术查找,递归全排序的程序
只看楼主 加入收藏
lsd98
Rank: 2
等 级:论坛游民
帖 子:51
专家分:26
注 册:2010-3-30
结帖率:76.92%
收藏
已结贴  问题点数:10 回复次数:10 
这是我写的一个集产生随机字母,二分技术查找,递归全排序的程序
#include<iostream>
#include<time.h>
using namespace std;
const int N=100;
int n,k=0;
char list[N];
int by(const char& x)
{
 int l=0;int r=n;
 while(l<=r)
 {
  int middle=(l+r)/2;
  if(x==list[middle]) return middle;
  if(x>list[middle]) l=middle+1;
  else r=middle-1;
 }
 return -1;
}
void set()
{
 int i,j,k,t,q;
 char temp;
 cout<<"确定产生随机数个数n=";
 cin>>n;
 srand( (unsigned)time( NULL ) );
 for(i=0;i<n;i++)
       list[i]=rand()%26+97;
 for(k=0;k<n-1;k++)
 { q=k;
  for(j=k+1;j<n;j++)
   if(list[j]<list[q]) q=j;
   if(q!=k)
   {temp=list[q];list[q]=list[k];list[k]=temp;}
 }
   cout<<" 产生的随机数为:"<<endl;
   for(t=0;t<n;t++)
   cout<<list[t]<<" ";
   cout<<endl;
}
void perm(char list[],int k)
{
 if(k==n)
 {
  for(int i=0;i<n;i++)
   cout<<list[i];
  cout<<endl;
 }
  else
   for(int i=k;i<n;i++)
   {
    swap(list[k],list[i]);
     perm(list,k+1);
    swap(list[k],list[i]);
   }
}
inline swap(char& a,char& b)
{
 char temp=a;a=b;b=temp;
}
int main()
{
 char x;
 set();
 cout<<"输入查找元素x=";cin>>x;
 int p=by(x);
 if(p==-1)
  cout<<"未找到x"<<endl;
 else
  cout<<"所找元素在第"<<p+1<<"个位置!"<<endl;
 cout<<"全排列结果:"<<endl;
 //perm(list,k);
 return 0;
}
现在有两个问题,1.rand()产生的随机数有重复!2.全排列函数无法处理有相同元素时全排列结果有重复问题!
请高手们指点迷津,寻求最优算法!!!
搜索更多相关主题的帖子: 随机 字母 递归 技术 
2010-04-01 12:37
lsd98
Rank: 2
等 级:论坛游民
帖 子:51
专家分:26
注 册:2010-3-30
收藏
得分:0 
没有人帮我么???????
2010-04-01 17:28
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:10 
没看到新贴。。生成生机数列的时候,有重复的数舍弃然后重新生成一个不同的数。
2010-04-02 14:51
lsd98
Rank: 2
等 级:论坛游民
帖 子:51
专家分:26
注 册:2010-3-30
收藏
得分:0 
这样算法效率会不会很低,有没有人帮我解决上面的第二个问题?排序问题

[ 本帖最后由 lsd98 于 2010-4-2 15:37 编辑 ]
2010-04-02 15:36
秀痘魔导士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:250
专家分:1150
注 册:2009-12-23
收藏
得分:0 
以下是引用lsd98在2010-4-2 15:36:21的发言:

这样算法效率会不会很低,有没有人帮我解决上面的第二个问题?排序问题
map查找,你只有26个,遍历速度也慢不到哪里去。
2010-04-02 15:46
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:0 
看看这样的方法怎么样?
程序代码:
#include<iostream>
#include<ctime>
using namespace std;
#define MAX_NUM 26
int main()
{
   int i, j, temp;
   int a[MAX_NUM+1], b[MAX_NUM+1];
   for(i = 0;i<=MAX_NUM;i++)
   {
      a[i]=i;
   }
   srand((unsigned)time(NULL));
   for(i=MAX_NUM, j=0; i>=1; i--)
   {
      temp= rand()%i + 1;
      b[j++] =a[temp];
      a[temp]=a[i];
   }
   for (j=0; j<MAX_NUM; j++)
   {
       cout<<(char)(b[j]+96)<<"   ";
   }
   return 0;
}
2010-04-02 19:14
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:0 
刚才那代码不直观。。又改了下。。时间复杂度为o(n)...
程序代码:
#include<iostream>
#include<ctime>
using namespace std;
#define MAX_NUM 26
#define Creat_NUM 26   // 这个表示产生几个无重复的字母
int main()
{
   int i, j, temp;
   int a[MAX_NUM+1], b[MAX_NUM+1];
   for(i = 0;i<=MAX_NUM;i++)
   {
      a[i]=i;
   }
   srand((unsigned)time(NULL));
   for(i=MAX_NUM, j=0; i>=1 || j<Creat_NUM; i--)
   {
      temp= rand()%i + 1;
      b[j++] =a[temp];
      a[temp]=a[i];
   }
   for (j=0; j<Creat_NUM; j++)
   {
       cout<<(char)(b[j]+96)<<"   ";
   }
   return 0;
}
2010-04-02 19:32
lsd98
Rank: 2
等 级:论坛游民
帖 子:51
专家分:26
注 册:2010-3-30
收藏
得分:0 
兄弟 这个不错!现在全排列函数无法处理有相同元素时全排列结果有重复问题!该什么弄?
2010-04-02 22:40
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:0 
只要将生成随机数的地方换成我的代码就行了··试试··
2010-04-02 22:46
lsd98
Rank: 2
等 级:论坛游民
帖 子:51
专家分:26
注 册:2010-3-30
收藏
得分:0 
不是 我是说我上面的全排列函数
void perm(char list[],int k)
如何拥有处理有相同元素数列全排列而不出现重复结果的功能,比如
输入aacc
输出
aacc
acac
acca
caac
caca
ccaa
这样的效果;方法还是上面的递归排列的方法 ;如何处理!
2010-04-02 23:02
快速回复:这是我写的一个集产生随机字母,二分技术查找,递归全排序的程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020092 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved