二分查找
来源:互联网 发布:晨风机器人授权源码 编辑:程序博客网 时间: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; } }}