二分查找

二分查找是一种算法,输入的是一个有序的元素列表。如果要查找的元素包含在列表中,二分查找会返回其位置;否则返回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         }

 

 

posted @ 2021-08-24 09:38  赵不灰  阅读(608)  评论(0编辑  收藏  举报