蛇形算法类似于下面的排序
A B C D
100 99 98 97
93 94 95 96
92 91 90 89
…………
如果拿1-100的数字来分配当然蛇形算法最好不过的了。
主算法产生类似0123321001233210....private static List<int> GetIndex(int num, int group)//num 代表新生数量,group代表班级数量。 { List<int> list = new List<int>(); //string result = ""; //一个索引的字符串,每位代表一个班级。 int index = 0;//索引字符串中的一位 int steps = 1; //步长 for (int i = 0; i < num; i++)//为每个新生找班级 { // result += index.ToString();//构造索引字符串 list.Add(index); if (index == group - 1)//判断是否到达班级队列尾部 { if (steps == 1) { index = group; } steps = -1;//修改前进方向为"<--" } if (index == 0)//判断是否到达班级队列首部 { if (steps == -1) { index = -1; } steps = 1;//修改前进方向为"-->" } index += steps; } return list;//result; }
蛇形分配private static void Distrube(List<int> list, int num, int group) { int c = 0; List<List<int>> slist = new List<List<int>>(); List<int> li = GetIndex(num, group); int ds = group; int dss = 1; for (int j = 0; j < li.Count; j++) { ds--; if (ds < 0) { if (dss == 1) { dss = 2; } else { dss = 1; } ds = group - 1; } if (slist.Count < group) { slist.Add(new List<int> { list[j] }); } else { c = j % group; if (dss == 1) { slist[c].Add(list[j]); } else { slist[ds].Add(list[j]); } } //new TanlanA().SortAsc(sumlist, slist);//对分组进行从小到大排序 } foreach (var item in slist) { Console.WriteLine("单个总和:{0}", item.Sum()); string[] arr = Array.ConvertAll(item.ToArray(), new Converter<int, string>((iii) => { return iii.ToString(); })); Console.WriteLine(string.Join(",", arr)); } }
调用 static void Main(string[] args) { int num = 100; int group = 4; List<int> list = new List<int>(); for (int i = num; i >= 0; i--) { list.Add(i); } int t = list.Sum(); Console.WriteLine("蛇形算法 总数:{0} 分配给{1}人的平均值:{2}", t, group, t / group); Distrube(list, num, group); Console.ReadLine(); }
结果: