二分查找
二分查找是一种算法,输入的是一个有序的元素列表。如果要查找的元素包含在列表中,二分查找会返回其位置;否则返回null.
下面的例子用来说明二分查找的工作原理:
现在有 1,2,3,4 ....100 的数字 .我随便想了一个数字,比如 73。你的目标是以最少的次数猜到 73 这个数字。你每次猜测后 我会告诉你小了、大了 还是对了!
傻瓜式的找:从1 开始猜到100 ,需要猜测100次,属于简单查找。
更佳的猜测是:
从50开始。 小了排除一半的数字。50都小了,再猜50~100中间的数字 75,依此这样猜测中间的数字,每次都排除一半的数字!
这就是二分查找。
不管我想的是哪个数字,你总是能7次之内猜到!因为每次都排除很多数字!
对于N个元素的有序列表,用二分查找最多需要log2N(以2为底的对数)
1
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 int target = 40;//要查找的目标
6 int[] orderlyArr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 20, 30, 40, 50, 60, 70, 80, 90, 100 };//有序列表
7 Searching.BinarySearch(orderlyArr, target, out int targetIndex);
8 switch (targetIndex)
9 {
10 case -1:
11 Console.WriteLine("在orderlyArr数组中没有找到 target " + target);
12 break;
13 default:
14 Console.WriteLine("在orderlyArr数组中找到 target " + target + " 的下标为:" + targetIndex);
15 break;
16 }
17 Console.ReadKey();
18 }
19 }
/// <summary>
2 /// 二分查找
3 /// </summary>
4 public static void BinarySearch(int[] arr, int target, out int targetIndex)
5 {
6 int num = 0; //查找次数
7
8 targetIndex = -1;
9 int low = 0;
10 int hight = arr.Length;
11 //什么情况下进行查找:hight > low
12 while (hight - low > 1)
13 {
14 num++;
15 Console.WriteLine(string.Format("第{0}次查找", num));
16 int midd = (hight + low) / 2;
17 int itemValue = arr[midd];
18 if (itemValue > target)
19 {
20 hight = midd - 1;
21 }
22 else if (itemValue < target)
23 {
24 low = midd + 1;
25 }
26 else
27 {
28 targetIndex = midd;
29 return;
30 }
31 }
32 }