二分查找条件:有序数组。
查找原理:查找过程从数组的中间元素开始,如果中间元素正好等于要查找的元素,则搜索过程结束;
如果某一特定元素大于或小于中间元素,则在数组大于或小于中间原色的那一半中查找,而且跟开始一样从中间元素开始比较。
如果在某一步骤数组为空,则代表找不到。
这种搜索算法每一次比较都使搜索范围缩小一半。
时间复杂度:O(logn)
使用二分查找有两个前提条件:
1,待查找的列表必须有序。
2,必须使用线性表的顺序存储结构来存储数据。
下面是实现代码。
C#版:
namespace BinarySearch.CSharp { class Program { static void Main(string[] args) { List<int> list = new List<int> { 10,20,30,40,50,60,70,80,90 }; Console.WriteLine("********************二分查找******************** "); Display(list); int result = BinarySearch(list, 40); if (result != -1) Console.WriteLine("40在列表中的位置是:{0}", result); else Console.WriteLine("对不起,列表中不存在该元素!"); Console.ReadKey(); } /// <summary> /// 二分查找 /// </summary> /// <param name="list">查找表</param> /// <param name="key">给定值</param> /// <returns>给定值在列表中的位置</returns> public static int BinarySearch(List<int> list, int key) { int low = 0; int high = list.Count - 1; while (low <= high) { int middle = (low + high) / 2; //判断中间记录是否与给定值相等 if (list[middle] == key) { return middle; } else { //在中间记录的左半区查找 if (list[middle] > key) high = middle - 1; //在中间记录的右半区查找 else low = middle + 1; } } //没有找到(查找失败) return -1; } private static void Display(IList<int> list) { Console.WriteLine(" **********展示结果********** "); if (list != null && list.Count > 0) { foreach (var item in list) { Console.Write("{0} ", item); } } Console.WriteLine(" **********展示完毕********** "); } } }
程序输出结果如图: