二分查找

来源:互联网 发布:晨风机器人授权源码 编辑:程序博客网 时间:2024/05/07 10:26
using System;using System.Collections.Generic;using System.Text;using System.Collections;using System.IO;using System.Threading;using System.IO.Ports;namespace Program{        class Program    {        static void Main()        {            int[] arr = new int[] {0,2,2,2,3,4,4,4,5,6,7,8,10 };            int r1 = binary_search_left(arr, 0, arr.Length, 4);            int r2 = binary_search_right(arr, 0, arr.Length, 4);            Console.WriteLine("{0},{1}",r1,r2);        }        //找最左边的那个        //算法3点保证        //1.left左边的数字肯定比val小,不然的话,left不会往右移的        //2.每次所讨论的区间都是在减小的,即right-left一直在减小        //3.最终left一定是等于right        private static int binary_search_left(int[] arr, int left, int right, int val)//left right 分别是数组的头尾index        {            int mid;            while (left < right)            {                mid = (right + left) / 2;                if (arr[mid] < val)                    left = mid + 1;                else                    right = mid;            }            if (arr[left] == val)                return left;            else                return -1;        }        //找最右边的那个        //算法3点保证        //1.right右边的数字肯定比val大,不然的话,right不会往左移的        //2.每次所讨论的区间都是在减小的,即right-left一直在减小        //3.最终left一定是等于right        private static int binary_search_right(int[] arr, int left, int right, int val)//left right 分别是数组的头尾index        {            int mid;            while (left < right)            {                mid = (right + left+1) / 2;                if (arr[mid] > val)                    right=mid-1;                else                    left = mid;            }            if (arr[left] == val)                return left;            else                return -1;        }    }}