二分查找

来源:互联网 发布:找不到男朋友 知乎 编辑:程序博客网 时间:2024/06/06 02:37

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

思想:在一个有序数组中(升序)查找某个值,每次将数组从中间一分为二,取头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
原创粉丝点击