基于二分查找的排序法(抓牌法)

1、  基于二分法的抓牌排序法

此方法主要模拟打扑克牌时在抓牌过程中的排序过程,第一张是基点,随后每一张牌先与第一张牌比小,小则在此位置前插入,否则与最后一张比大,大则追加到末尾。再如果则进行二分法查找与之最临近的点进行插入。

需要用到ArrayList数组,利用其插入操作,及追加操作。

例:int [] ints={3,6,9,2,17,7,4};

    

 /// <summary>

        /// 二分法排序(模拟抓牌)
        /// </summary>
        /// <param name="ints">待排序数组</param>
        /// <returns>升序</returns>
        public ArrayList Sort_Dichotomy(int[] ints)
        {
            int count = ints.Length;
            int tempCount = 2;//记录当前数组中实际存在的值
            ArrayList al = new ArrayList(count + 1);//模拟抓牌
            al.Add(0);
            al.Add(ints[0]); 


            for (int i = 1; i < ints.Length; i++)
            {


                if (ints[i] <= Convert.ToInt32(al[1]))//1.与最小值比小
                {
                    al.Insert(1, ints[i]);
                }
                else
                {
                    if (ints[i] >= Convert.ToInt32(al[al.Count - 1]))//与最大值比大
                    {
                        al.Add(ints[i]);
                    }
                    else//二分查找
                    {
                        int begin = 0;
                        int end = tempCount;
                        while (begin + 1 < end)
                        {
                            int middle = (begin + end) / 2;
                            int r = ints[i] - Convert.ToInt32(al[middle]) >= 0 ? 1 : -1;//分为大于等于、小于
                            switch (r)
                            {
                                case 1://大于
                                    begin = middle;
                                    break;
                                default:
                                    end = middle;
                                    break;
                            }
                        }
                        al.Insert(end, ints[i]);
                    }
                }


                tempCount += 1;//新增1


            }
            al.RemoveAt(0);
            return al;
           
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值