当前位置: 首页 > news >正文

折半查找的实现代码:

递归实现:

#include <iostream>

// 二分法:递归
int searchBin(int arr[], int x, int low, int high) {
	int mid;

	if(low > high)
		return -1;
	mid = (low + high) / 2;
	if(x == arr[mid])
		return mid;
	else if(x < arr[mid])
		return searchBin(arr, x, low, mid-1);
	else
		return searchBin(arr, x, mid+1, high);
}

int main(int argc, const char * argv[]) {
	// insert code here...
	int arr[] = {8, 10, 12, 15, 25, 27, 30, 38}; // 初始化数组
	int len, x, loc; // len存储数组的实际长度,x要查找的数, loc位置

	len = sizeof(arr) / sizeof(arr[0]); // 整个数组长度
	std::cout << "请输入要查找的数:\n";
	while(std::cin >> x) {
		loc = searchBin(arr, x, 0, len-1); // 调用二分查找函数
		if(loc >= 0)
			std::cout << "在数组中找到了" << x << ",在数组中是第" << (loc + 1) << "个。\n";
		else
			std::cout << "在数组中找不到" << x << std::endl;
		std::cout << "请继续输入要查找的数:\n";
	}
	return 0;
}

 

#include <stdio.h>
#include <stdlib.h>
#define keyType int
typedef struct {
    keyType key;//查找表中每个数据元素的值
    //如果需要,还可以添加其他属性
}ElemType;
typedef struct{
    ElemType *elem;//存放查找表中数据元素的数组
    int length;//记录查找表中数据的总数量
}SSTable;
//创建查找表
void Create(SSTable **st,int length){
    (*st)=(SSTable*)malloc(sizeof(SSTable));
    (*st)->length=length;
    printf("输入表中的数据元素:\n");
    //根据查找表中数据元素的总长度,在存储时,从数组下标为 1 的空间开始存储数据
    for (int i=1; i<=length; i++) {
        scanf("%d",&((*st)->elem[i].key));
    }
}
//折半查找算法
int Search_Bin(SSTable *ST,keyType key){
    int low=1;//初始状态 low 指针指向第一个关键字
    int high=ST->length;//high 指向最后一个关键字
    int mid;
    while (low<=high) {
        mid=(low+high)/2;//int 本身为整形,所以,mid 每次为取整的整数
        if (ST->elem[mid].key==key)//如果 mid 指向的同要查找的相等,返回 mid 所指向的位置
        {
            return mid;
        }else if(ST->elem[mid].key>key)//如果mid指向的关键字较大,则更新 high 指针的位置
        {
            high=mid-1;
        }
        //反之,则更新 low 指针的位置
        else{
            low=mid+1;
        }
    }
    return 0;
}
int main(int argc, const char * argv[]) {
    SSTable *st;
    Create(&st, 11);
    getchar();
    printf("请输入查找数据的关键字:\n");
    int key;
    scanf("%d",&key);
    int location=Search_Bin(st, key);
    //如果返回值为 0,则证明查找表中未查到 key 值,
    if (location==0) {
        printf("查找表中无该元素");
    }else{
        printf("数据在查找表中的位置为:%d",location);
    }
    return 0;
}

以图 1 的查找表为例,运行结果为: 
输入表中的数据元素: 
5 13 19 21 37 56 64 75 80 88 92 
请输入查找数据的关键字: 
21 
数据在查找表中的位置为:4 
折半查找的性能分析 :是比一一对比快的,其实就是AVL树:  log2(n+1)-1

相关文章:

  • 唯物论和辩证法,认识论:客观规律,方法论:认识世界改造世界方法
  • 重心,形心,质心 形心质心公式之一 形心质心公式之二​ 转换 ​​ 应用:举例:D:是圆;
  • 考研考试需要准备什么
  • 考研政治大题答题技巧2
  • 走过的路没有什么对与错,主要是你走过,你经历了,有所收获,这就是对的 。不负此生,不负他人足矣
  • 循环链表建立
  • 如何进行快速高效的学习
  • 操作系统简介,中断,通道,调度算法
  • 计算机操作系统中处理机和cpu和内核三者的区别?
  • 想要学习人工智能?这里有一条完整路径
  • android ANR产生原因和解决办法
  • Handler的作用与用法,handler在Thread中传递,Activity像service 传递信息:使用广播
  • java中创建线程的三种方法
  • java环境搭建,jdk和jre的区别,android studio安装
  • Android Studio 常用快捷方式
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • CentOS7 安装JDK
  • ComponentOne 2017 V2版本正式发布
  • HTML5新特性总结
  • HTTP请求重发
  • Laravel核心解读--Facades
  • mysql 5.6 原生Online DDL解析
  • PhantomJS 安装
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • SpiderData 2019年2月13日 DApp数据排行榜
  • 关于for循环的简单归纳
  • 力扣(LeetCode)21
  • 盘点那些不知名却常用的 Git 操作
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #{}和${}的区别是什么 -- java面试
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (23)Linux的软硬连接
  • (二)springcloud实战之config配置中心
  • (黑马C++)L06 重载与继承
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)Windows2003安全设置/维护
  • (转)四层和七层负载均衡的区别
  • (转载)Google Chrome调试JS
  • .NET Core 版本不支持的问题
  • .net程序集学习心得
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • @开发者,一文搞懂什么是 C# 计时器!
  • [100天算法】-实现 strStr()(day 52)
  • [2023-年度总结]凡是过往,皆为序章
  • [Android] Implementation vs API dependency
  • [Android]如何调试Native memory crash issue
  • [Angular] 笔记 16:模板驱动表单 - 选择框与选项
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析
  • [AutoSar]BSW_Com02 PDU详解
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)
  • [bzoj1038][ZJOI2008]瞭望塔