首页 > 代码库 > 排列数据的输出(二) 循环处理

排列数据的输出(二) 循环处理

  排列组合是高中是学到的 知识,理论上很清楚,但如何使用代码实现,却一直没有尝试过,近段时间由于项目需要,写一个排列的算法,想不到却花费了不少时间。

 在排列数据的输出一文中列举了几种输出的方法,但都是递归的方法,但又没有不用递归,只用循环的方法呢?于是自己就开始考虑了,都知道

要把4个元素的所有排列输出,必须递归4次,对应的是4层的循环,要把5个元素的所有组合输出,必须递归5次,对应的是5层的循环,一时间自己竟没有找到如何把递归改为循环的方法。于是自己就一最简单的方法,思考一个元素的排列,两个元素的排列,三个元素的排列

在参考了组合数据的输出(二)的想法后,想不到竟然也有了启发。

例如:1,2,3的排列

考察:1的排列 ,只有{1}

考察:1,2的排列,2可以插入到1的前边,也可以插入到1的后边,又是有两种{1,2};{2,1}

考察:1,2,3的排列,3可以插入到集合{1,2}中任意一个元素的前边和后边,也可以插入到集合{2,1}中任意一个元素的前边和后边


使用代码实现

 public static void CreatSumData5(List<string> columnNameList)
        {
            List<List<string>> list = new List<List<string>>();
            string nameFirst = columnNameList[0];//第一个元素时特殊处理          
               
           List<string> itemTemp3 = new List<string>();
           itemTemp3.Add(nameFirst);
                list.Add(itemTemp3);
            for (int i = 1; i < columnNameList.Count; i++)//跳过已处理的第一个元素
            {

                string name = columnNameList[i];//第一个元素时特殊处理  
                int count = list.Count;
                List<List<string>> listLast = new List<List<string>>();//保存上次生成的集合数据
                listLast.AddRange(list);//把上次生成的集合数据放入listLast
                list.Clear();//清空上次的数据,因为每次生成的集合已经和上次不一样了
                for (int j = 0; j < count; j++)//遍历上次生成的集合
                {
                    List<string> itemListLast = new List<string>();//处理集合
                    itemListLast.AddRange(listLast[j]);
                    int count2 = itemListLast.Count;
                    for (int k = 0; k < count2; k++)//给集合中的每一个可能位置插入新的元素
                    {
                        List<string> itemTemp = new List<string>();
                        itemTemp.AddRange(itemListLast);
                        itemTemp.Insert(k,name);
                        list.Add(itemTemp);
                    }
                    List<string> itemTemp2 = new List<string>();//在最后一个位置放入新的元素
                    itemTemp2.AddRange(itemListLast);
                    itemTemp2.Add(name);
                    list.Add(itemTemp2);
                }
             
            }
            StringBuilder strs = new StringBuilder();
            for (int j = 0; j < list.Count; j++)
            {
                List<string> item = list[j];
                for (int i = 0; i < item.Count; i++) 
                {
                    strs.Append(item[i]+",");
                }            
                strs.AppendLine("");
            }
            WrieData(strs.ToString());
        }
        private static void WrieData(string text)
        {
            string file = "ZuheTestout.js";
            StreamWriter sr = new StreamWriter(file);
            sr.WriteLine(text);
            sr.Close();
        }
        public static void Test()
        {
            List<string> columns = new List<string>();
            columns.Add("c0");
            columns.Add("c1");
            columns.Add("c2");
            columns.Add("c3");
            //  columns.Add("c4");
            //  CreatSumData1(columns);
            //  string text = CreateAllGroupingData(columns);
            //   WrieData(text);
            CreatSumData5(columns);
        }


排列数据的输出(二) 循环处理