【基本算法-1】二分法排序,查找

二分法排序: 

void Start()
     {
         int[] tempArrayList = new int[11]{3,4,7,3,2,1,11,9,6,1,121};
         HalfSort(tempArrayList);
         for(int i = 0;i < tempArrayList.Length;i ++)
         {
             Debug.Log(tempArrayList[i]);
         }
     }

    public void HalfSort(int[] _array)
    {
        for(int i = 0;i < _array.Length;i++)
        {
            int tempStartIndex = 0;
            //index(i)跟index[0-(i-1)]之前的数组元素比较
            int tempEndIndex = i - 1;
            int tempMiddleIndex;
            int tempCurrentValue = _array[i];
            int tempMiddleValue;
            while(tempStartIndex <= tempEndIndex)
            {
                //index(0-(i-1)) 中间的元素
                tempMiddleIndex = (tempStartIndex + tempEndIndex)/2;
                tempMiddleValue = _array[tempMiddleIndex];
                //index(0-(i-1)) 中间的元素值比index(i)位置的元素值大,说明
                //index(tempMiddleIndex-tempEndIndex)的元素值比 index(i)元素值大
                //结束index直接从tempEndIndex跳到中间元素index(tempMiddleIndex)之前
                //if(tempCurrentValue > tempMiddleValue) 降序
                if(tempMiddleValue > tempCurrentValue)
                {
                    tempEndIndex = tempMiddleIndex-1;
                }else
                {
                    //index(0-(i-1)) 中间的元素值比index(i)位置的元素值小,说明
                    //index(tempStartIndex-tempMiddleIndex)的元素值比 index(i)元素值小
                    //开始index直接从tempStartIndex跳到中间元素index(tempMiddleIndex)之后
                    tempStartIndex = tempMiddleIndex+1;
                }
                //Debug.Log(tempStartIndex + "_" + tempEndIndex);
            }
            //当前要排序index(i) = 7,如果插入位置为7之前,比如index(4-5)之间(结束while排序时tempEndIndex = 4)
            //将index(5-6)往后移动1个位置,覆盖当前要排序的index(7),空出index(5),然后index(5) = tempCurrentValue
            for(int j = i-1;j > tempEndIndex;j--)
            {
                _array[j+1] = _array[j];
            }
            //例如:插入位置为index(4-5)中间,
            //(4+5)/2 = 4 tempCurrentValue > tempMiddleValue; 4 = tempEndIndex = tempMiddleIndex-1;
            //(5+5)/2 = 5 tempCurrentValue < tempMiddleValue; 5 = tempStartIndex = tempMiddleIndex+1;
            // tempStartIndex > tempEndIndex while结束
            _array[tempStartIndex] = tempCurrentValue;
        }
    }

运行结果:

二分法查找:

二分法查找必要条件是数据必须排好序的。

void Start()
     {
        int[] tempArrayList = new int[11]{1,1,2,3,3,4,6,7,9,11,121};
         int tempIndex = SearchSort(tempArrayList,7,0,tempArrayList.Length-1);
         if(tempArrayList[tempIndex] == 7)
         {
            Debug.Log("查找value = 7 index = " + tempIndex + " 查找成功");
         }
     }
  
    public int SearchSort(int[] _array,int _value,int _startIndex,int _endIndex)
    {
        if(_startIndex > _endIndex)
        {
            return - 1;
        }
        int tempMiddleIndex = (_startIndex + _endIndex)/2;
        int tempMiddleValue = _array[tempMiddleIndex];
        //中间位置正好是要查找值,返回index
        if(tempMiddleValue == _value)
        {
            return tempMiddleIndex;
        }
        //tempMiddleValue > _value 说明index(tempMiddleIndex-_endIndex)区间的都大于_value,最大查找index改为 = tempMiddleIndex - 1)
        if(tempMiddleValue > _value)
        {
            return SearchSort(_array,_value,_startIndex,tempMiddleIndex - 1);
        }else
        {
            return SearchSort(_array,_value,tempMiddleIndex+1,_endIndex);
        }
    }

参考:

https://blog.csdn.net/yysyangyangyangshan/article/details/7399645

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值