关于二分查找算法(也叫折半查找)

二分查找算法是一种快速的查找算法。当我们再一个数组中查找是否存在某个数时,通常是直接遍历

这个数组直到找到这个数,时间复杂度为O(n)试想如果数据量很大,上亿呢,怎么办,这里我们可以用

一种简单快速的的查找算法--二分查找算法也叫做折半查找算法。

 

二分查找算法的算法思维:

1.首先查找数组必须是有序的(假设为升序)。

2.取查找数组中间的数作为基准,如果需要查找的数据大于基准说明该数存在于 数组的左边。反之存在于基准右边。

3 假设待查找的数小于基准,那么将基准换成左子数组的中间的数,重复步骤2,直到找到该数。

 

很显然对于上亿规模的数据查找,我们可以将待查找的数据进行排序,然后再用二分查找进行查找。

 

二分查找的时间复杂度为O(logn),

logn是什么意思呢  意思是当我们在1000个元素中查找某个元素时 只需要10次比较就可以找到该元素

 

记住二分查找只能针对有序数据,切记这一点。

 

二分查找实现如下:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 bool FindByTwo(int *nums,int numsSize,int number)
 5 {
 6     int mid;
 7     int left=0;
 8     int right=numsSize-1;
 9     
10 
11     while(left!=right)
12     {
13         mid=(left+right)/2;    
14         if(number==nums[mid])
15         {
16             return true;
17         }
18         else
19         {
20             if(number>nums[mid])
21             {
22                 left=mid+1;
23             }
24             if(number<nums[mid])
25             {
26                 right=mid-1;
27             }
28         }
29     }
30 
31 
32     return false;
33 }
34 
35 
36 int main()
37 {
38 
39     int nums[10]={1,2,3,4,5,6,7,8,9,10};
40     int numsSize=10;
41     int number=8;
42     if(FindByTwo(nums,numsSize,number))
43     {
44         cout<<"Find The number: "<<number<<endl; 
45     }
46     else
47     {
48         cout<<"Can not Find The number: "<<number<<endl; 
49     }
50     return 0;
51 }

运行截图:

当查找8时:

当查找20时:

 

 

OK,二分查找就介绍结束了哦

posted @ 2015-07-21 17:46  vpoet  阅读(10458)  评论(0编辑  收藏  举报