介绍摘自百度百科:
算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。主要思想是:(设查找的数组区间为array[low, high])
(1)确定该区间的中间位置K(2)将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。区域确定如下:a.array[k]>T 由数组的有序性可知array[k,k+1,……,high]>T;故新的区间为array[low,……,K-1]b.array[k]<T 类似上面查找区间为array[k+1,……,high]。每一次查找与中间值比较,可以确定是否查找成功,不成功当前查找区间缩小一半,递归找,即可。时间复杂度:O(log2n)。
//下面是一个扩展类 using System.Collections.Generic; using System.Linq; namespace DichotomizingAlgorithm { public static class RewriteArray { /// <summary> /// 对数组功能进行扩展 /// </summary> /// <param name="i"></param> /// <returns></returns> public static int[] Sort(this int[] i) { List<int> list=i.ToList(); list.Sort(); i = list.ToArray<int>(); return i; } } }
using System; namespace DichotomizingAlgorithm { class Program { static int[] num=new int[10]; static void Main(string[] args) { InitData(); //自动载入数据 Console.WriteLine("数值:"); Console.Write("排序前:"); foreach (int item in num) { Console.Write(item + " "); } num=num.Sort(); //由小到大排序 Console.Write("\n排序后:"); foreach (int item in num) { Console.Write(item + " "); } Console.WriteLine("\n请输入要查询数字:"); int target = int.Parse(Console.ReadLine()); int result = BinSearch(num, num.Length, target)+1; Console.WriteLine(target+"位于第"+result+"个"); Console.ReadKey(); } static void InitData() { for (int i = 0; i < num.Length; i++) { //由于Random.Next()生成的数据在短时间内会一样建议用下面的方法生成 var Seed = Guid.NewGuid().GetHashCode(); var value = new Random(Seed); num[i] =value.Next(1,100); } } /// <summary> /// 二分法查找数据位置 当数据量大时可用此方法 /// </summary> /// <param name="num">欲查找数据的数组</param> /// <param name="count">数据的长度</param> /// <param name="target">被查找的目标</param> /// <returns></returns> static int BinSearch(int[] num,int count,int target) { int low = 0; int high = count - 1; int mid; while(low<=high) { if(num[low]==target) { return low; } else if(num[high]==target) { return high; } //不用(high+low)/2 是为了防止数据溢出 mid = low + ((high - low) / 2); if(num[mid]==target) { return mid; } if(num[mid]<target) { low = mid + 1; } else { high = mid - 1; } } return -1; //没有找到的话返回-1 } } }
运行结果: