C语言-数据结构 折半查找

        在折半查找中,刚开始学可能会在下标处产生困惑,例如奇数个长度的数组怎么处理,偶数个长度的数组怎么处理,不需要修改代码吗?并且下标我从1开始算和0开始算影响代码吗?其实都可以用一样的代码,产生困惑的原因我觉得是例子不够,虽然你感觉理解了思想,但是对于这些细节的地方还是容易头大,可以自行列举出奇数长度有序数组、偶数长度有序数组、折半算法代码修改为下标从0开始数的、1开始数的(数组0位置不存储元素)你会惊讶的发现原来都可以找到,这些例子在你的手动计算下都跑通的话,我想你就算掌握折半查找的算法了!

下面代码我分别列举出奇数个数数组、偶数个数数组以及两种折半函数从0开始计算和从1开始计算

#include <stdio.h>
// 二分查找函数
//Binary_Search1代码中下标从1开始查找,n为数组的最大索引=实际数组长度-1
int Binary_Search1(int* a, int n, int key) {
    int low, high, mid; // 定义低、高索引和中间索引
    low = 1;            // 设置低索引为1(假设数组从下标1开始)
    high = n;          // 设置高索引为n(即数组的最后一个元素的索引)
    // 进入循环,直到low超过high
    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; // 如果未找到目标值,返回0
}
//代码中下标从0开始查找,n为数组的最大索引=实际数组长度-1
int Binary_Search2(int* a, int n, int key) {
    int low, high, mid; // 定义低、高索引和中间索引
    low = 0;            // 设置低索引为1(假设数组从下标1开始)
    high = n;          // 设置高索引为n(即数组的最后一个元素的索引)
    // 进入循环,直到low超过high
    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; // 如果未找到目标值,返回0
}
int main() {
    // 初始化一个有奇数个元素的数组
    int jishu[] = { 0, 1, 16, 24, 35, 47, 59, 62, 73, 88, 99,100 };
    // 初始化一个有偶数个元素的数组
    int oshu[] = { 0, 1, 16, 24, 35, 47, 59, 62, 73, 88, 99 };
    // 调用二分查找函数并打印结果
    // 注意:传入的数组长度应为有效元素个数
    printf("下标从1开始查找\n");
    printf("奇数数组查找100结果为:%d\n", Binary_Search1(jishu, 11, 100));
    printf("偶数数组查找99结果为:%d\n", Binary_Search1(oshu, 10, 99));
    printf("奇数数组查找0结果为:%d\n", Binary_Search1(jishu, 11, 0));
    printf("偶数数组查找0结果为:%d\n", Binary_Search1(oshu, 10, 0));
    printf("\n下标从0开始查找\n");
    printf("奇数数组查找100结果为:%d\n", Binary_Search2(jishu, 11, 100));
    printf("偶数数组查找99结果为:%d\n", Binary_Search2(oshu, 10, 99));
    printf("奇数数组查找0结果为:%d\n", Binary_Search2(jishu, 11, 0));
    printf("偶数数组查找0结果为:%d\n", Binary_Search2(oshu, 10, 0));
    return 0; 
}

运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/889779.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java项目-----图形验证码登陆实现

原理: 验证码在前端显示,但是是在后端生成, 将生成的验证码存入redis,待登录时,前端提交验证码,与后端生成的验证码比较. 详细解释: 图形验证码的原理(如下图代码).前端发起获取验证码的请求后, 1 后端接收请求,生成一个键key(随机的键) 然后生成一个验证码作为map的valu…

蒙特卡罗方法 - 不同的峰值之间的混合挑战篇

序言 蒙特卡罗方法&#xff0c;也称为统计模拟法或统计试验法&#xff0c;是一种以概率统计理论为基础的数值模拟方法。自 20 20 20世纪 40 40 40年代中期提出以来&#xff0c;它因能灵活处理复杂计算问题而广泛应用于多个领域&#xff0c;如金融工程学、宏观经济学和计算物理…

Transformer 模型和 BERT 模型:概述

语言模型发展历程Language modeling history 多年来&#xff0c;语言建模一直在不断发展。过去十年的最新突破&#xff0c;包括使用神经网络来表示文本&#xff0c;比如2013年的Word2vec和N元语法&#xff0c;2014年开发的序列到序列模型&#xff0c;如RNN和LSTM帮助提高机器学…

(C语言贪吃蛇)16.贪吃蛇食物位置随机(完结撒花)

目录 前言 修改方向 修改内容 效果展示 两个新的问题&#x1f64b; 1.问题1 2.问题2 代码如下&#xff1a; 前言 我们上一节实现了贪吃蛇吃食物身体节点变长&#xff0c;但是食物的刷新位置不是随机的&#xff0c;并且初始化几次后食物就刷不见了&#xff0c;本节我们就来…

[AWS云]kafka调用和创建

背景:因为因为公司的项目需要使用AWS的kafka&#xff0c;但是在创建和使用过程中都遇到了一些报错和麻烦&#xff0c;毕竟老外的东西&#xff0c;和阿里云、华为使用起来还是不一样。 一、创建&#xff08;创建的配置过程就略了&#xff0c;就是配置一下可用区、型号&#xff0…

RNN心脏病预测

本文为为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 一 前期准备 1.数据导入 import pandas as pd from keras.optimizers import Adam from matplotlib import pyplot as plt from sklearn.model_selection import train_test_split from sklearn.p…

Flink job的提交流程

在Flink中&#xff0c;作业&#xff08;Job&#xff09;的提交流程是一个复杂的过程&#xff0c;涉及多个组件和模块&#xff0c;包括作业的编译、优化、序列化、任务分发、任务调度、资源分配等。Flink通过分布式架构来管理作业的生命周期&#xff0c;确保作业在不同节点上以高…

std::future::then的概念和使用方法

std::future::then是 C 中用于异步操作的一种机制&#xff0c;它允许在一个异步任务完成后&#xff0c;接着执行另一个操作&#xff08;即延续操作&#xff09;。以下是关于 std::future::then 的概念和使用方法&#xff1a; 1. 概念&#xff1a; std::future::then 的主要目…

python 边际分布图

import seaborn as snspenguins sns.load_dataset("penguins") colors {"Gentoo": #AE5259, "Adelie": #CF992C, "Chinstrap": #6B9DAA}# 分类散点图 sns.jointplot(datapenguins, x"bill_length_mm", y"bill_depth_…

MyBatisPlus分页查询

一、导入依赖 <!-- MyBatis-plus的依赖 --> <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.4</version> </dependency><!-- mysql的依赖 --> &l…

CocosCreator 快速部署 TON 游戏:Web2 游戏如何使用 Ton支付

在本篇文章中&#xff0c;我们将继续探讨如何使用 Cocos Creator 开发 Telegram 游戏&#xff0c;重点介绍如何集成 TON 支付功能。通过这一教程&#xff0c;开发者将学会如何在游戏中接入 TON Connect&#xff0c;实现钱包连接、支付以及支付后的校验流程&#xff0c;最终为 W…

贴吧软件怎么切换ip

在网络使用中&#xff0c;有时我们需要切换IP地址来满足特定的需求&#xff0c;比如需要切换贴吧软件IP以进行不同的操作。本文将介绍几种贴吧切换IP地址的方法&#xff0c;帮助用户更好地管理自己的网络身份和访问权限。 1、更换网络环境‌ 通过连接到不同的Wi-Fi网络或使用移…

TON生态小游戏开发:推广、经济模型与UI设计的建设指南

随着区块链技术的快速发展&#xff0c;基于区块链的Web3游戏正引领行业变革。而TON生态小游戏&#xff0c;借助Telegram庞大的用户基础和TON&#xff08;The Open Network&#xff09;链上技术&#xff0c;已成为这一领域的明星之一。国内外开发者正迅速涌入&#xff0c;开发和…

【开源】RISC-V 修改neofetch中的Host描述

neofetch 介绍 neofetch 是一款用于在终端中显示系统信息的工具&#xff0c;其主要特点是以美观的方式展示宿主机的基本信息。它通常用于展示系统的分发版本、内核版本、硬件信息、桌面环境&#xff0c;以及一些个性化的设置&#xff0c;配合 ASCII 艺术风格的 logo&#xff0…

基于Opencv中的DNN模块实现图像/视频的风格迁移

一、DNN模块的介绍 1、简介 OpenCV中的DNN&#xff08;Deep Neural Network&#xff09;模块是一个功能强大的组件&#xff0c;它支持深度学习网络模型的加载和推理。虽然DNN模块不提供模型的训练功能&#xff0c;但它可以与主流的深度学习框架&#xff08;如TensorFlow、Caf…

Visual Studio的实用调试技巧总结

对于很多学习编程的老铁们来说&#xff0c;是不是也像下面这张图一样写代码呢&#xff1f; 那当我们这样编写代码的时候遇到了问题&#xff1f;大家又是怎么排查问题的呢&#xff1f;是不是也像下面这张图一样&#xff0c;毫无目的的一遍遍尝试呢&#xff1f; 这篇文章我就以 V…

iPhone使用指南:如何在没有备份的情况下从 iPhone 恢复已删除的照片

本指南将向您展示如何在没有备份的情况下从 iPhone 恢复已删除的照片。我们所有人在生活中的某个时刻都一定做过一些愚蠢的事情&#xff0c;例如从手机或电脑中删除一些重要的东西。这是很自然的&#xff0c;没有什么可羞耻的。您可能在辛苦工作一天后回来。当突然想看一些照片…

科技云报到:云服务的中场战事,从AI应用开始

科技云报到原创。 从去年的大模型之战&#xff0c;到今年的AI应用之争&#xff0c;云服务正在迈入全新的发展阶段。AI这个杠杆将各家厂商的竞争策略更向前推进了一步。 “云AI”能够孵化出多少可能&#xff1f;在业界眼中&#xff0c;“云AI”则意味着新的悬念&#xff1a;云计…

Java基础知识全面总结

第一章&#xff1a;类与对象 第一课&#xff1a;什么是面向对象编程 1.面向对象编程和面向过程编程的区别 无论是面向过程编程还是面向对象编程都是用于解决一个实际问题&#xff0c;当面向过程编程在解决一个问题时&#xff0c;更多的情况下是不会做出重用的设计思考的&…

蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555

蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555 第一节 硬件解读第二节 CubeMx配置第三节 代码1&#xff0c;脉冲部分代码2&#xff0c;ADC部分代码![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/57531a4ee76d46daa227ae0a52993191.png) 第一节 …