zoukankan      html  css  js  c++  java
  • 全排列和组合算法

    C#中使用的全排列和组合算法:

            /// <summary>
            /// 对数组进行组合操作,选取selectCount个元素进行组合
            /// </summary>
            /// <param name="lsArray">即将进行组合操作的数组</param>
            /// <param name="selectCount">选取的元素的个数</param>
            static void Combination(List<string> lsArray, int selectCount)
            {
                int totolcount = lsArray.Count;
                int[] currectselect = new int[selectCount];
                int last = selectCount - 1;
                for (int i = 0; i < selectCount; i++)
                {
                    currectselect[i] = i;
                }
                while (true)
                {
                    for (int i = 0; i < selectCount; i++)
                    {
                        Console.Write(" {0} ", lsArray[currectselect[i]]);
                    }
                    Console.WriteLine();
                    if (currectselect[last] < totolcount - 1)
                    {
                        currectselect[last]++;
                    }
                    else
                    {
                        int pos = last;
                        while (pos > 0 && currectselect[pos - 1] == currectselect[pos] - 1)
                        {
                            pos--;
                        }
                        if (pos == 0) return;
                        currectselect[pos - 1]++;
                        for (int i = pos; i < selectCount; i++)
                        {
                            currectselect[i] = currectselect[i - 1] + 1;
                        }
                    }
                }
            }
    

     排列算法(递归):

            /// <summary>
            /// 对数组进行全排列
            /// </summary>
            /// <param name="lsArray">要进行全排列的数组</param>
            /// <param name="begin">进行全排列的开始下标</param>
            /// <param name="end">进行全排列的结束下标</param>
            static void array(List<string> lsArray, int begin, int end)
            {
                if (begin == end)
                {
                    for (int i = 0; i <= end; i++)
                        Console.Write(" {0} ", lsArray[i]);
                    Console.WriteLine();
                }
                for (int i = begin; i <= end; i++)
                {
                    Swap(lsArray, begin, i);
                    array(lsArray, begin + 1, end);
                    Swap(lsArray, begin, i);
                }
            }
    
            /// <summary>
            /// 交换数组中的下标为x,y的值
            /// </summary>
            /// <param name="lsArray">该数组</param>
            /// <param name="x"></param>
            /// <param name="y"></param>
            static void Swap(List<string> lsArray, int x, int y)
            {
                string t = lsArray[x];
                lsArray[x] = lsArray[y];
                lsArray[y] = t;
            }
    
  • 相关阅读:
    pass cloudcc
    eclipse生成javaDoc时,出现"编码GBK 的不可映射字符"
    tabWidget 直布局
    用 Navicat for Oracle 管理 Oracle10g/11g 数据库
    Aspx页面内 成员变量丢失的问题
    AspNet2.0页面生命周期
    【Z】浅析豆瓣的 Google Analytics 应用
    绑定SqlDataSource的Gridview字符串字段长度截取(转)
    Java web 推荐书籍
    关于Reapeter的总结
  • 原文地址:https://www.cnblogs.com/rainnight/p/2557622.html
Copyright © 2011-2022 走看看