C# 全排列算法

实现方式:

采用插值的方法。

如:{1,2,3,4}  把2 插入到1中 得到结果为 1,2 2,1 之后采取递归的方式再把3 插入到 1,2 2,1 两个数组中。。。

结果为:

4 3 2 1,3 4 2 1,3 2 4 1,3 2 1 4 ,4 2 3 1,

2 4 3 1,2 3 4 1,2 3 1 4 4 2 1 3,2 4 1 3,

2 1 4 3,2 1 3 4 4 3 1 2,3 4 1 2,3 1 4 2,

3 1 2 4 4 1 3 2,1 4 3 2,1 3 4 2,1 3 2 4,

4 1 2 3,1 4 2 3,1 2 4 3,1 2 3 4

代码如下:

     /// <summary>     /// 插入对象v到对象数组o中     /// </summary>     /// <param name="o">目标对象数组</param>     /// <param name="v">插入值</param>     /// <param name="lb">展现控件</param>     /// <param name="size">源数组的长度,判断何时对展现控件赋值</param>     /// <returns>查数之后的结果集</returns>     public string[] insertVal(object[] o, object v, ListBox lb, int size)     {         int len = o.Length;         object[] tep = new object[len + 1];         string[] result = new string[len + 1];

        for (int i = 0; i < len + 1; i++)         {             for (int j = 0; j < len; j++)             {                 tep[j] = o[j];             }             moveVal(ref tep, i, len);             tep[i] = v;

            string s = ""; for (int k = 0; k < len + 1; k++)             {                 s = s + tep[k] + " ";             }             s = s.Substring(0, s.Length - 1);             if (tep.Length == size)                 lb.Items.Add(s);

            result[i] = s;         } return result;

    }

    /// <summary>     /// 移动数组,起始位置数据依次顺移到截止位置     /// </summary>     /// <param name="o">源数组</param>     /// <param name="start">起始位置</param>     /// <param name="end">截止位置</param>     void moveVal(ref object[] o, int start, int end)     {         for (int i = end; i >= start; i--)         {             if (i > 0) o[i] = o[i - 1];         }     }

    string[] tt = null;

    /// <summary>     /// 递归方法体,递归插值     /// </summary>     /// <param name="o">源数组</param>     /// <param name="s">待插值数组</param>     /// <param name="start">起始插入位置</param>     /// <param name="lb">展现控件</param>     public void GetAllPL(object[] o, string[] s, int start, ListBox lb)     {         object[] t = null;         if (start >= o.Length) return;         for (int k = 0; k < s.Length; k++)         {             t = s[k].Split(' ');             if (start > t.Length) start = t.Length;             tt = insertVal(t, o[start], lb, o.Length);             start = start + 1;             GetAllPL(o, tt, start, lb);         }     }

    private void button6_Click(object sender, System.EventArgs e)     {         listBox1.Items.Clear();         object[] o = new object[] { 1, 2, 3, 4, 5, 6 };

        int start = 1;         new plzh().GetAllPL(o, new string[] { o[0].ToString() }, start, listBox1);     }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值