zoukankan      html  css  js  c++  java
  • 折半算法,也就是二分查找法

    一:用递归算法

      /// <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);

  • 相关阅读:
    赵炯博士《Linux内核完全注释》
    0.11内核rd_load@ramdisk.c中memcpy函数好像有bug
    Can't find kernel text map area from kcore
    Could not allocate 40960 bytes percpu data
    镜像
    H3C S6800交换机 BCM shell命令
    Bean的作用域
    Bean之间的关系
    Bean的自动装配
    Java8 Hash改进/内存改进
  • 原文地址:https://www.cnblogs.com/nsky/p/6776349.html
Copyright © 2011-2022 走看看