代码改变世界

折半算法,也就是二分查找法

  糯米粥  阅读(687)  评论(0编辑  收藏  举报

一:用递归算法

复制代码
  /// <summary>
        /// 
        /// </summary>
        /// <param name="num">数组</param>
        /// <param name="curr">被查找的数</param>
        /// <param name="count">需要查找的索引位置</param>
        /// <param name="isAfter">true 向前,false 向后</param>
        /// <returns></returns>
        public static int change(int[] num, int curr, int count, bool isAfter)
        {
            int index = count;
            if (isAfter)
                index = Convert.ToInt32(Math.Ceiling(count / 2d));
            //判断索引是否越界
            if (index >= num.Length)
            {
                return -1;
            }

            if (num[index] < curr) //后半部分查找
            {
                return change(num, curr, index + num.Length, true);
            }
            else if (num[index] > curr) //前半部分查找
            {
                return change(num, curr, index - 1, false);
            }
            else if (curr == num[index])
            {
                return index;
            }
            return -1;
        }
复制代码

 

二:用while循环查找

复制代码
 /// <summary>
        /// 
        /// </summary>
        /// <param name="num">需要查找的数组</param>
        /// <param name="curr">查找的数</param>
        /// <returns></returns>
        public static int change2(int[] num, int curr)
        {
            int count = num.Length;
            int index = Convert.ToInt32(Math.Ceiling(count / 2d));
            while (true)
            {
                //判断索引是否越界
                if (index >= num.Length)
                {
                    return -1;
                }

                if (num[index] < curr)
                {
                    count = index + num.Length;
                    index = Convert.ToInt32(Math.Ceiling(count / 2d));
                    continue;
                }
                else if (num[index] > curr)
                {
                    count = index - 1;
                    index = count;
                    continue;
                }
                else if (curr == num[index])
                {
                    return index;
                }
            }
        }
复制代码

 

 

 

 

 

测试:

 int[] num = { 1, 2, 8, 9, 95, 98, 100, 190, 900 };

            int results = change(num, 100, num.Length, false);

            int resultss = change2(num, 100);

 

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
'
点击右上角即可分享
微信分享提示