免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: crulat
打印 上一主题 下一主题

[数值计算] 任意排列、组合算法终极Shell脚本 [复制链接]

论坛徽章:
1
双子座
日期:2013-10-17 00:46:45
11 [报告]
发表于 2012-06-21 01:43 |只看该作者
顶!!!!

论坛徽章:
0
12 [报告]
发表于 2012-06-21 20:43 |只看该作者
代码已优化,现在速度已经非常快了!

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
13 [报告]
发表于 2012-06-22 01:28 |只看该作者
crulat 发表于 2012-06-20 03:31
Invoke the script:
C 4 3P 4 3C 8 5P 5 5

呵呵

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int *flag;
  4. void print(int*a,int num)
  5. {
  6.         int i;
  7.         num--;
  8.         for(i=0;i<num;i++)
  9.                 printf("%d->",a[i]);
  10.         printf("%d\n",a[num]);
  11. }

  12. int next(int*a,int m, int n,int how)
  13. {
  14.         int i,j,k,x;
  15.         if(how) {
  16.                 for(j=n-1;j>=0;j--) {
  17.                         for(i=a[j];i<m;i++)
  18.                                 if(flag[i]==0)
  19.                                         break;
  20.                         if(i<m) {
  21.                                 flag[a[j]-1]=0;
  22.                                 a[j]=i+1;
  23.                                 flag[i]=1;

  24.                                 for(x=0,k=j+1;k<n;k++) {
  25.                                         while(flag[x]==1)x++;
  26.                                         a[k]=x+1;
  27.                                         flag[x]=1;
  28.                                 }
  29.                                 return 0;
  30.                         }
  31.                         flag[a[j]-1]=0;
  32.                 }
  33.         }
  34.         else {
  35.                 if(a[n-1]<m) {
  36.                         a[n-1]++;
  37.                         return 0;
  38.                 }
  39.                 for(i=n-1;i>0;i--)
  40.                         if(a[i]>a[i-1]+1)
  41.                                 break;
  42.                 if(i>0) {
  43.                         a[i-1]++;
  44.                         for(;i<n;i++)
  45.                                 a[i]=a[i-1]+1;
  46.                         return 0;
  47.                 }
  48.         }
  49.         return 1;
  50. }

  51. int main(int argc,char**argv)
  52. {
  53.         int *a,i;
  54.         char c;
  55.         int m,n;
  56.         int how=0;
  57.         c=argv[3][0];
  58.         sscanf(argv[1],"%d",&m);
  59.         sscanf(argv[2],"%d",&n);
  60.         if(!(0<n&&n<=m)||(c!='P'&&c!='p'&&c!='C'&&c!='c'))
  61.                 return 1;
  62.         a = malloc(sizeof(int)*n);
  63.         if(c=='P'||c=='p') {
  64.                 how =1;
  65.                 flag = malloc(sizeof(int)*m);
  66.                 for(i=0;i<n;i++)
  67.                         flag[i]=1;
  68.                 for(;i<m;i++)
  69.                         flag[i]=0;
  70.         }
  71.         if(a==NULL)
  72.                 return 1;
  73.         for(i=0;i<n;i++)
  74.                 a[i]=i+1;
  75.         while(1) {
  76.                 print(a,n);
  77.                 if(next(a,m,n,how))
  78.                         return 0;
  79.         }
  80. }

复制代码
没有递归,只有迭代

  1. linux-p94b:~ # ./a.out 4 3 c
  2. 1->2->3
  3. 1->2->4
  4. 1->3->4
  5. 2->3->4
  6. linux-p94b:~ # ./a.out 4 3 p | xargs -n 6
  7. 1->2->3 1->2->4 1->3->2 1->3->4 1->4->2 1->4->3
  8. 2->1->3 2->1->4 2->3->1 2->3->4 2->4->1 2->4->3
  9. 3->1->2 3->1->4 3->2->1 3->2->4 3->4->1 3->4->2
  10. 4->1->2 4->1->3 4->2->1 4->2->3 4->3->1 4->3->2
  11. linux-p94b:~ # ./a.out 8 5 c | xargs -n 8
  12. 1->2->3->4->5 1->2->3->4->6 1->2->3->4->7 1->2->3->4->8 1->2->3->5->6 1->2->3->5->7 1->2->3->5->8 1->2->3->6->7
  13. 1->2->3->6->8 1->2->3->7->8 1->2->4->5->6 1->2->4->5->7 1->2->4->5->8 1->2->4->6->7 1->2->4->6->8 1->2->4->7->8
  14. 1->2->5->6->7 1->2->5->6->8 1->2->5->7->8 1->2->6->7->8 1->3->4->5->6 1->3->4->5->7 1->3->4->5->8 1->3->4->6->7
  15. 1->3->4->6->8 1->3->4->7->8 1->3->5->6->7 1->3->5->6->8 1->3->5->7->8 1->3->6->7->8 1->4->5->6->7 1->4->5->6->8
  16. 1->4->5->7->8 1->4->6->7->8 1->5->6->7->8 2->3->4->5->6 2->3->4->5->7 2->3->4->5->8 2->3->4->6->7 2->3->4->6->8
  17. 2->3->4->7->8 2->3->5->6->7 2->3->5->6->8 2->3->5->7->8 2->3->6->7->8 2->4->5->6->7 2->4->5->6->8 2->4->5->7->8
  18. 2->4->6->7->8 2->5->6->7->8 3->4->5->6->7 3->4->5->6->8 3->4->5->7->8 3->4->6->7->8 3->5->6->7->8 4->5->6->7->8
  19. linux-p94b:~ # ./a.out 5 5 p | xargs -n 12
  20. 1->2->3->4->5 1->2->3->5->4 1->2->4->3->5 1->2->4->5->3 1->2->5->3->4 1->2->5->4->3 1->3->2->4->5 1->3->2->5->4 1->3->4->2->5 1->3->4->5->2 1->3->5->2->4 1->3->5->4->2
  21. 1->4->2->3->5 1->4->2->5->3 1->4->3->2->5 1->4->3->5->2 1->4->5->2->3 1->4->5->3->2 1->5->2->3->4 1->5->2->4->3 1->5->3->2->4 1->5->3->4->2 1->5->4->2->3 1->5->4->3->2
  22. 2->1->3->4->5 2->1->3->5->4 2->1->4->3->5 2->1->4->5->3 2->1->5->3->4 2->1->5->4->3 2->3->1->4->5 2->3->1->5->4 2->3->4->1->5 2->3->4->5->1 2->3->5->1->4 2->3->5->4->1
  23. 2->4->1->3->5 2->4->1->5->3 2->4->3->1->5 2->4->3->5->1 2->4->5->1->3 2->4->5->3->1 2->5->1->3->4 2->5->1->4->3 2->5->3->1->4 2->5->3->4->1 2->5->4->1->3 2->5->4->3->1
  24. 3->1->2->4->5 3->1->2->5->4 3->1->4->2->5 3->1->4->5->2 3->1->5->2->4 3->1->5->4->2 3->2->1->4->5 3->2->1->5->4 3->2->4->1->5 3->2->4->5->1 3->2->5->1->4 3->2->5->4->1
  25. 3->4->1->2->5 3->4->1->5->2 3->4->2->1->5 3->4->2->5->1 3->4->5->1->2 3->4->5->2->1 3->5->1->2->4 3->5->1->4->2 3->5->2->1->4 3->5->2->4->1 3->5->4->1->2 3->5->4->2->1
  26. 4->1->2->3->5 4->1->2->5->3 4->1->3->2->5 4->1->3->5->2 4->1->5->2->3 4->1->5->3->2 4->2->1->3->5 4->2->1->5->3 4->2->3->1->5 4->2->3->5->1 4->2->5->1->3 4->2->5->3->1
  27. 4->3->1->2->5 4->3->1->5->2 4->3->2->1->5 4->3->2->5->1 4->3->5->1->2 4->3->5->2->1 4->5->1->2->3 4->5->1->3->2 4->5->2->1->3 4->5->2->3->1 4->5->3->1->2 4->5->3->2->1
  28. 5->1->2->3->4 5->1->2->4->3 5->1->3->2->4 5->1->3->4->2 5->1->4->2->3 5->1->4->3->2 5->2->1->3->4 5->2->1->4->3 5->2->3->1->4 5->2->3->4->1 5->2->4->1->3 5->2->4->3->1
  29. 5->3->1->2->4 5->3->1->4->2 5->3->2->1->4 5->3->2->4->1 5->3->4->1->2 5->3->4->2->1 5->4->1->2->3 5->4->1->3->2 5->4->2->1->3 5->4->2->3->1 5->4->3->1->2 5->4->3->2->1
  30. linux-p94b:~ #

复制代码

论坛徽章:
0
14 [报告]
发表于 2012-06-22 08:30 |只看该作者
回复 13# cjaizss

佩服,佩服!
大一统的方法,果断收藏,学习了!
   

论坛徽章:
0
15 [报告]
发表于 2012-06-22 09:27 |只看该作者
楼上各位都好强,自惭形秽呀~~~  学习中~~~

论坛徽章:
0
16 [报告]
发表于 2012-06-22 19:49 |只看该作者
有意思!mark一下。

论坛徽章:
0
17 [报告]
发表于 2012-06-23 23:05 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
18 [报告]
发表于 2012-10-29 21:31 |只看该作者
永夜····牛啊

论坛徽章:
3
天蝎座
日期:2013-11-11 10:18:392015年亚洲杯之沙特阿拉伯
日期:2015-04-06 15:51:08CU十四周年纪念徽章
日期:2017-01-07 22:56:29
19 [报告]
发表于 2012-10-30 08:59 |只看该作者
回复 13# cjaizss


    果然牛帖,

论坛徽章:
3
天蝎座
日期:2013-11-11 10:18:392015年亚洲杯之沙特阿拉伯
日期:2015-04-06 15:51:08CU十四周年纪念徽章
日期:2017-01-07 22:56:29
20 [报告]
发表于 2012-10-30 12:28 |只看该作者
回复 1# crulat


    我在想,如果要排列的元素在一个文件中,该怎么实现呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP