蛇形算法

蛇形算法类似于下面的排序
  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();
}


结果:

image

转载于:https://www.cnblogs.com/ivanyb/archive/2011/11/30/2269393.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值