全排列算法的非递归实现

  1. //本代码转自网络
  2. long begintime = Environment.TickCount;
  3.         private void button6_Click(object sender, EventArgs e)
  4.         {
  5.             int slen = 4;//长度
  6.             int wlen = 3;//位数,<=长度
  7.             List<string> sarr = new List<string>();
  8.             for (int i = 1; i <= slen; i++)
  9.             {
  10.                 sarr.Add(i.ToString());
  11.             }
  12.             string ts = string.Empty;
  13.             Random rad = new Random();
  14.             ArrayList al = new ArrayList();//数组
  15.             int len = 1;//总数
  16.             int tlen = slen - wlen + 1;//排列
  17.             while (slen >= tlen)
  18.             {
  19.                 len = len * (slen--);
  20.             }
  21.             while (al.Count < len)
  22.             {
  23.                 while (ts.Length < wlen)
  24.                 {
  25.                     string tmp = sarr[rad.Next(sarr.Count)];
  26.                     if (ts.IndexOf(tmp) < 0)
  27.                         ts += tmp;
  28.                 }
  29.                 if (!al.Contains(ts))
  30.                     al.Add(ts);//添加
  31.                 ts = "";
  32.             }
  33.             al.Sort();//排序
  34.             long endtime = Environment.TickCount;
  35.             long stime = endtime - begintime;//耗时
  36.             MessageBox.Show(string.Format("排列出{0}个不相同且无重复数字的{1}位数!/r/n耗时{2}毫秒", len, wlen, stime));
  37.             richTextBox1.Clear();
  38.             for (int i = 0; i < al.Count; i++)
  39.             {
  40.                 richTextBox1.AppendText(al[i].ToString() + "/r/n");//输出
  41.             }
  42.         }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值