CSDN21天学习挑战赛——折半查找算法学习笔记

​活动地址:CSDN21天学习挑战赛

一、折半查找算法

1、基本思路

折半查找,也称二分查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高。但是该算法的使用的前提是静态查找表中的数据必须是有序的。

在折半查找之前对查找表按照所查的关键字进行排序的意思是:若查找表中存储的数据元素含有多个关键字时,使用哪种关键字做折半查找,就需要提前以该关键字对所有数据进行排序。

2、算法流程

1)输入

待查元素key

n个数的有序序列,以数组为例,默认升序

2)查找过程

核心思想:不断缩小搜索的范围,每次取区间的中心来进行比较

过程如下图所示,low、high、mid分别指向待查区间的下界、上界、中点

待查区间的中心元素与key比较有三种情况:

  • 中心元素大于key:待查元素一定在该元素左侧,在左半区间继续查找
  • 中心元素等于key:查找成功,直接返回对应的位置
  • 中心元素小于key:待查元素一定在该元素右侧,在右半区间继续查找

只要不断重复取中间比较和指定新的搜索区间这两步骤,直到请参见的两个端点重合,表示搜索完毕。

3)输出

查找成功:返回元素所在位置的编号

查找失败:返回-1或自定义失败的标志

3、伪代码

left = 1
right = A.length
while left <= right
    mid = (left + right) / 2
    if A[mid] == key
        return mid
    else if A[mid] > key
        right = mid - 1
    else
        left = mid + 1
return -1

二、算法实现

1、基本算法实现

c语言实现

#include <stdio.h>
#include <stdlib.h>

//折半查找,又称为二分查找 ,条件保证要好排序的,不适合应用在频繁的插入操作,因为会打乱顺序
int Binary_Search(int *a,int n,int key)
{
    int low,high,mid;
    low = 0;    //定义最低下标为记录首位
    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; 
    }
    return -1; //没有找到返回-1
}

void main()
{
    int a[] = {1,2,3,4,5,6,7,8,9,10};
    int index;//下标
    index = Binary_Search(a, sizeof(a) / sizeof(int),8);
    if (index == -1)
        printf("没有找到");
    else
        printf("找到了,index为:%d",index);
}

 

2、时间性能分析

1)最好的情况

第一次找到key,时间复杂度:O(1)

2)最坏的情况

最后一次找到key或查找失败,时间复杂度:O(log2n)(以2为底)

3)平均情况

时间复杂度:O(log2n)(以2为底)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值