zoukankan      html  css  js  c++  java
  • 关于二分查找算法(也叫折半查找)

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

    这个数组直到找到这个数,时间复杂度为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,二分查找就介绍结束了哦

  • 相关阅读:
    CodeForces 706C Hard problem
    CodeForces 706A Beru-taxi
    CodeForces 706B Interesting drink
    CodeForces 706E Working routine
    CodeForces 706D Vasiliy's Multiset
    CodeForces 703B Mishka and trip
    CodeForces 703C Chris and Road
    POJ 1835 宇航员
    HDU 4907 Task schedule
    HDU 4911 Inversion
  • 原文地址:https://www.cnblogs.com/vpoet/p/4665172.html
Copyright © 2011-2022 走看看