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

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

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

要把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);
        }

时间: 2024-11-05 14:51:27

排列数据的输出(二) 循环处理的相关文章

排列数据的输出

排列组合是高中是学到的 知识,理论上很清楚,但如何使用代码实现,却一直没有尝试过,近段时间由于项目需要,写一个排列的算法,想不到却花费了不少时间. 需求很简单,就是典型的排列应用. 例如输入:C0,C1,C2,C3,C4,输出C0,C1,C2,C3,C4的所有排列. 实现代码: /// <summary> /// 输出所有排列的数据 /// </summary> /// <param name="columns">输入的排列的所有元素</par

递归求解几类排列组合问题(二、全组合排列)

对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. Sample Input 3 1 2 3 Sample Output 123 132 213 231 312 321 #include<stdio.h> #include<strin

组合数据的输出

排列组合是高中是学到的 知识,理论上很清楚,但如何使用代码实现,却一直没有尝试过,近段时间由于项目需要,写一个组合的算法,想不到却花费了不少时间. 需求很简单,就是典型的组合应用. 例如输入:C0,C1,C2,C3,C4,输出C0,C1,C2,C3,C4的所有组合. 由于输入数据的个数不确定,自然不能使用一般的循环,只能使用递归加循环. 经过不断的实验的和测试,发现有两种实现方法,   1根据组合长度的输出,例如对于输入C0,C1,C2,C3,C4的五个元素,先输出,一个元素的所有组合,再输出两

2016-1-9作业——输出二维数组的和

1 int [][] array2 = {{1,2,3,4},{5,6,7,8}};//第二种方式创建并初始化数组 2 3 //输出数组中所有元素的和 4 int sum = 0; 5 6 for(int i = 0;i<array2.length;i++){ //利用for循环输出 7 8 for(int j = 0;j<array2[i].length;j++){ 9 10 System.out.print(array2[i][j]+" ");//输出二维数组中的元素

向文件输出数据的输出字节流

1 package com.outputstream; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.io.InputStream; 9 import java.util.Arrays; 1

菜鸟nginx源码剖析数据结构篇(二) 双向链表ngx_queue_t

nginx源码剖析数据结构篇(二) 双向链表ngx_queue_t Author:Echo Chen(陈斌) Email:[email protected] Blog:Blog.csdn.net/chen19870707 Date:October 20h, 2014 1.ngx_queue优势和特点 ngx_queue作为顺序容器链表,它优势在于其可以高效地执行插入.删除.合并操作,在插入删除的过程中,只需要修改指针指向,而不需要拷贝数据,因此,对于频繁修改的容器很适合.此外,相对于STL li

从零开始学android&lt;ListView数据列表显示组件.二十一.&gt;

与滚动视图(ScrollView)类似的还有一种列表组件(ListView),可以将多个组件加入到ListView之中以达到组件的滚动显示效果,ListView组件本身也有对应的ListView类支持,可以通过操作ListView类以完成对此组组件的操作,ListView类的继承结构如下所示: java.lang.Object ? android.view.View ? android.view.ViewGroup ? android.widget.AdapterView<T extends a

STL学习篇:数据的输出

我们都知道计算机由5个部分组成:控制器(Control).运算器(Datapath). 存储器(Memory).输入(Input system) 输出(Output system).不管是什么时候,我们都是得到相应的数据,然后输入到处理设备进行相应处理,然后输出,这其中不能缺少任何一个环节!所有现在人们提高计算机的处理速度是很重要的,那么数据的输入.输出操作也是非常重要的!这两天一直在学习STL,就给大家说一说在程序应用中,数据输出的方法,这里只是涉及一些简单的皮毛,比较简单,只是使用函数方法的

菜鸟nginx源码剖析数据结构篇(二) 双向链表ngx_queue_t[转]

nginx源码剖析数据结构篇(二) 双向链表ngx_queue_t Author:Echo Chen(陈斌) Email:[email protected] Blog:Blog.csdn.net/chen19870707 Date:October 20h, 2014 1.ngx_queue优势和特点 ngx_queue作为顺序容器链表,它优势在于其可以高效地执行插入.删除.合并操作,在插入删除的过程中,只需要修改指针指向,而不需要拷贝数据,因此,对于频繁修改的容器很适合.此外,相对于STL li