zoukankan      html  css  js  c++  java
  • 数据结构之折半查找

    数据结构之--折半查找

    定义:折半查找技术,也就是二分查找。它的前提是线性表中的记录必须是关键码有序(通常从大到小有序),线性表必须采用顺序存储。折半查找的基本思想是:取中间记录作为比较对象,若给定值与中间记录的关键字,则在中间记录的关键字相等,则查找成功;若给定值小于中间记录的作伴去继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止。

    图解

    时间复杂度:由于具有n个节点的完全二叉树的深度为⌊log₂n⌋+1,尽管折半查找判定二叉树并不是完全二叉树,但同样相同的推导可以得出,最坏的情况查找到关键字或者查找失败的次数为⌊log₂n⌋+1。因此我们折半算法的时间复杂度为:O(logn),它显然远远好于顺序查找的O(n)的时间复杂度了。

    #include<stdio.h>

    int Binary_Search(int *a,int n,int key){

      int low,mid,high;

      low = 1;                      /*定义最低下表为记录首位*/

      high = n;                      /*定义最高下表为记录末位*/

      while(low<=high){

        mid=(low+high)/2;              /*折半*/

        if(key<a[mid])                 /*若查找值比中值小*/

          high=mid-1;                /*最高下标调整到中位下标小一位*/

        else if(key>a[mid])                ​/*若查找值比中值大*/

          low=mid+1;                  ​/*最低下标调整到中值位下标大一位*/

        else

          return mid;                   ​/*若相等说明mid即为查找到的位置*/

      }

      return 0;

    }

    void main(){

      int num[] = {0,1,16,24,35,47,59,62,73,88,99};

      int result = Binary_Search(num,sizeof(num)/sizeof(num[0])-1,62);

      printf("查找结果为:%d ",result);

    }

    运行结果为: 

     

  • 相关阅读:
    从零开始实现ASP.NET Core MVC的插件式开发(一)
    如何在C#中调试LINQ查询
    如何将Azure SQL 数据库还原到本地数据库实例中
    如何在ASP.NET Core自定义中间件中读取Request.Body和Response.Body的内容?
    使用Try.NET创建可交互.NET文档
    针对.NET Core, Xamarin以及.NET的自动类型安全Rest库: Refit
    C#中使用Bogus创建模拟数据
    如何在ASP.NET Core中使用Azure Service Bus Queue
    使用强类型实体Id来避免原始类型困扰(一)
    .NET中的状态机库Stateless
  • 原文地址:https://www.cnblogs.com/zhengjunfei/p/4713575.html
Copyright © 2011-2022 走看看