二分查找

二分查找的前提条件是数组有序,以整型升序数组为例

思想:在一个有序数组中(升序)查找某个值,每次将数组从中间一分为二,取头head,中间mid,尾tail。若mid值大于待查找的值,则把tail重新定位在mid的位子上,对从head到tail的“新”数组进行下一次二分;若mid值小于待查找的值,就把head重新定位在mid的位子上,对从head到tail的“新”数组进行下一次查找。

好的,现在开始写代码。

public static int BiSeach(int[] a, int n,int val)
        {
            int head, tail, mid;
            head = 0;
            tail = n;
            int i;
            for(i=0;i<tail ;i++)
            {
                
            }
        }//这是第一段失败了的代码

for应该怎么去运行呢?

看来这样不行,得换一种写法。

 static void Main(string[] args)
        {
            int[] a=new int []{0,1,2,3,4,5,6,7};
           // int head, tail, mid;
            int val;
            Console.WriteLine("Input a number ");
            val = Convert.ToInt32(Console.ReadLine());
            int result = BiSeach(a, 8, val);
            if (result>=0)
                Console.WriteLine("found at a[{0}]", result);
            Console.ReadKey();

        }
        public static int BiSeach(int[] a, int n,int val)
        {
            int head, tail, mid;
            head = 0;
            tail = n;
            int i;
            while (head <= tail)
            {
                mid = (head + tail) / 2;
                if (val == a[mid])
                    return mid;
                else if (a[mid] > val)
                    tail = mid;
                else
                    head = mid;

            }
            Console.WriteLine("Not found!");
            return -1;
        }
这次看上去没错了吧?

经过运行,0~7确实都能找出来,但是这样就真的没有问题了么。。。。

于是,输入了8之后,它死循环了。


又经过了一番改动,终于没问题了。。。。

class Program
    {
        static void Main(string[] args)
        {
            int[] a=new int []{0,1,2,3,4,5,6,7};
           // int head, tail, mid;
            int val;
            Console.WriteLine("Input a number ");
            val = Convert.ToInt32(Console.ReadLine());
            int result = BiSeach(a, 8, val);
            if (result>=0)
                Console.WriteLine("found at a[{0}]", result);
            else
                Console.WriteLine("Not found!");
            Console.ReadKey();

        }
        public static int BiSeach(int[] a, int n,int val)
        {
            int head, tail, mid;
            head = 0;
            tail = n-1;
            int i;
            while (head <=tail)
            {
                mid = head + (tail-head) / 2;//判断到底有没有
                if (val == a[mid])
                    return mid;
                else if (a[mid] > val)
                    tail = mid-1;//mid不是,可以排除掉了
                else
                    head = mid+1;

            }
            return -1;
        }
    }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值