折半查找(数据结构)

0x01 原理

​ 从表的中间记录开始, 如果给定值和中间记录的关键字相等, 则查找成功;如果给定值大于或者小于中间记录的关键字,则在表中大于或小于中间记录的那一半中查找,这样重复操作,直到查找成功,或者在某一步中查找区间为空,则代表查找失败。

0x02 使用条件

  • 序列为连续存储
  • 序列为有序序列

0x03 时间复杂度

​ 折半查找的时间复杂度为 O(log n) 。

0x04 代码实现

//线性表查找 ———— 折半查找(二分查找)

#include <iostream>
#include <cstring>

using namespace std;

//顺序表结构
typedef struct 
{
    /*
    **该查找方法要求:
    **存储方式:顺寻存储
    **表中元素:按关键字有序排列
    */
    int * key;
    int len;
}SSTable;

int Search_Bin(SSTable ST, int key){
    //非递归算法
    //返回位置,起始位置为 1
    int low =0,high = ST.len-1;
    int mid = (low + high) / 2;
    while (low <= high){
        if (ST.key[mid] == key){
            return mid + 1;
        }
        else if (key < ST.key[mid]){
            high = mid-1;
        }
        else {
            low = mid+1;
        }
        mid = (low + high) / 2;
    }
    return 0;           //失败返回 0 
}


int Search_bin_rec(SSTable st,int key,int low,int high){
    //此为递归算法
    if (low > high){
        return 0;
    }
    int mid = (low + high) / 2;
    if (st.key[mid] == key){
        return mid + 1;
    }
    else if (st.key[mid] < key){
        return Search_bin_rec(st,key,mid + 1,high);
    }
    else{
        return Search_bin_rec(st,key,low,mid -1);
    }
}

//主函数
int main(){
    SSTable st;
    int bin[] = {1,5,9,10,15,16,17,21,25,34,36,38,42,45,49,51};
    st.key = bin;
    st.len = sizeof(bin)/sizeof(int);
    int flag = Search_Bin(st,49);
    cout << "The flag position is:"<<flag <<endl;
    flag = Search_bin_rec(st,49,0,st.len-1);
    cout << "The flag position is:"<<flag <<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值