首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C中的二进制搜索总是返回FALSE

二进制搜索(Binary Search)是一种高效的查找算法,适用于已排序的数据集。它的基本思想是通过逐步缩小查找范围来快速定位目标值。下面我将详细解释二进制搜索的基础概念、优势、类型、应用场景,并分析为什么在C语言中可能会遇到总是返回FALSE的问题,以及如何解决这些问题。

基础概念

二进制搜索的工作原理如下:

  1. 初始化:设定两个指针,lowhigh,分别指向数组的起始和结束位置。
  2. 循环查找:在每次循环中,计算中间位置 mid,并比较中间位置的值与目标值。
  3. 调整范围
    • 如果中间值等于目标值,返回 TRUE 或相应的索引。
    • 如果中间值大于目标值,将 high 更新为 mid - 1
    • 如果中间值小于目标值,将 low 更新为 mid + 1
  • 终止条件:当 low 超过 high 时,表示未找到目标值,返回 FALSE

优势

  • 时间复杂度:O(log n),比线性搜索快得多。
  • 适用性:仅适用于已排序的数据集。

类型

  • 迭代实现:使用循环进行查找。
  • 递归实现:通过函数递归调用自身进行查找。

应用场景

  • 数据库索引查找
  • 大型数据集的快速检索
  • 算法竞赛中的常用技巧

可能的问题及解决方法

问题:C中的二进制搜索总是返回FALSE

这通常是由于以下原因之一造成的:

  1. 数据未排序:二进制搜索的前提是数据必须已排序。
  2. 边界条件处理不当:可能导致无限循环或提前退出。
  3. 整数溢出:在计算 mid 时可能发生整数溢出。

示例代码及解决方法

以下是一个正确的二进制搜索C语言实现示例:

代码语言:txt
复制
#include <stdio.h>
#include <stdbool.h>

bool binarySearch(int arr[], int size, int target) {
    int low = 0;
    int high = size - 1;

    while (low <= high) {
        // 防止整数溢出
        int mid = low + (high - low) / 2;

        if (arr[mid] == target) {
            return true;
        } else if (arr[mid] < target) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }
    return false;
}

int main() {
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int size = sizeof(arr) / sizeof(arr[0]);
    int target = 5;

    if (binarySearch(arr, size, target)) {
        printf("Element found\n");
    } else {
        printf("Element not found\n");
    }

    return 0;
}

关键点总结

  • 确保数据已排序
  • 正确处理边界条件
  • 注意整数溢出问题

通过以上方法,可以有效避免二进制搜索在C语言中总是返回FALSE的问题。希望这些信息对你有所帮助。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

c++中的二叉搜索树

③左右子树均为二叉搜索树。...二·性能分析: 最优情况下,⼆叉搜索树为完全⼆叉树(或者接近完全⼆叉树),其⾼度为:O(log2 N) 最差情况下,⼆叉搜索树退化为单⽀树(或者类似单⽀),其⾼度为:O( N) 所以综合⽽⾔⼆叉搜索树增删查改时间复杂度为...:O(N) 下面是它的缺点:插入的数据在它中应该是有序的,而且要知道这样会可以随机访问里面的数据,那么插入与删除就变得复杂了,因此引出后面需要的平衡二叉树。...,因此就按照它的性质去查找即可: bool find(const k& key) {//这里也可搞成返回bsnode*类型方便使用 bsnode* cur = _root; while (cur...; else parent->_right = cur; return true; } } bool find(const k& key) {//这里也可搞成返回

5610
  • C语言计算整数二进制位中的1的个数

    前言 在计算机中存储数据/信息/代码,是以二进制方式存储,所以我们为了更加了解计算机的运行方式,需要去了解一下关于计算二进制位中的1和0的个数的方法。...本文是关于C语言中计算整数二进制位中的1的个数的三个方法。 一、关于一个整数的二进制表示方法 整数包括:正整数、负整数、零。...在二进制表示中,正整数和零的原码,反码,补码是一致的;负整数的原码,反码,补码表示方法各不一样。...二、计算二进制中的1的方法 1.取余法 注意:本方法只能争对非负整数 将一个非负整数进行转变为计算机中存储的二进制,本质上就是对该非负整数,不断地对2整除和取余....2.移位法 在C语言中,右移运算符(按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1)可以帮助我们完成计算二进制中的1的个数。

    69640

    c#中executeNonQuery执行异常怎么处理_getchar的返回值

    大家好,又见面了,我是你们的朋友全栈君。 SqlCommand.ExecuteNonQuery 方法对连接执行 Transact-SQL 语句并返回受影响的行数。...备注: 可以使用 ExecuteNonQuery 来执行目录操作(例如查询数据库的结构或创建诸如表等的数据库对象),或通过执行 UPDATE、INSERT 或 DELETE 语句,在不使用...DataSet 的情况下更改数据库中的数据。...虽然 ExecuteNonQuery 不返回任何行,但映射到参数的任何输出参数或返回值都会用数据进行填充。对于 UPDATE、INSERT 和 DELETE 语句,返回值为该命令所影响的行数。...对于所有其他类型的语句,返回值为 -1。如果发生回滚,返回值也为 -1 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

    94710

    JZ15 二进制中1的个数(牛客)(C语言)

    专栏:https://blog.csdn.net/2301_79293429/category_12545690.html 该题我为笨办法,与题解不同,如有疑问和见解,欢迎大家在评论区提出 题目链接: 二进制中...1的个数_牛客题霸_牛客网 (nowcoder.com) 描述 输入一个整数 n ,输出该数32位二进制表示中1的个数。...数据范围:−2^31<=n<=2^31−1 即范围为:−2147483648<=n<=2147483647 示例1 输入: 10 复制返回值: 2 复制说明: 十进制中10的32位二进制表示为0000...示例2 输入: -1 返回值: 32 说明: 负数使用补码表示 ,-1的32位二进制表示为1111 1111 1111 1111 1111 1111 1111 1111,其中32个1 一开始我看见标签为简单...在这里,有些人可能就想:int占4个字节,在内存中占32个比特位,由于最高位为符号位,为1表示负数,为0表示正数,而-2147483648是int类型的最小值,所以-2147483648在内存中的存储为

    7410

    剑指Offer的学习笔记(C#篇)-- 二进制中1的个数

    题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 一 . 解题思路 新颖的解法,使得该题目运用到了二进制的位运算符。先了解一下位运算符! ?...此题便很好的发挥了位运算符&的特点,怎么想呢?...这样:二进制数均是由0和1构成,当输入的参数X不等于0时,我们使用该参数X与(X-1)做&运算,运算结果如下图,可见,由于X与X-1的二进制变化是发生在X为1最后一位,即X-1在此处以后的位置均发生了改变...,&运算后发现比X最后面少了一个1,因此,此时,记录一次,然后循环往复,直至X为0,记录的次数即为X中1的个数。...=0) { x++; //&为二进制取位符 n=n&(n-1); } return

    42210

    C# 委托Func() 中 GetInvocationList() 方法的使用 | 接收委托多个返回值

    在日常使用委托时,有以下常用方法 方法名称 说明 Clone 创建委托的浅表副本。 GetInvocationList 按照调用顺序返回此多路广播委托的调用列表。...GetMethodImpl 返回由当前的 MulticastDelegate 表示的静态方法。...RemoveImpl 调用列表中移除与指定委托相等的元素 ---- GetInvocationList() 的用途 当委托有多个返回值时 当你编写一个 delegate委托 或 Func泛型委托...调用委托后,只能获取到最后一个调用方法的返回值。 ---- 使用 GetInvocationList()  GetInvocationList() 能够返回 这个委托的方法链表。...通过使用循环,把每个方法顺序调用一次,每次循环中都会产生当前调用方法的返回值。

    2.8K20

    JZ15 二进制中1的个数(两种解法)(C语言)

    type=blog 专栏:https://blog.csdn.net/230 题目链接: 二进制中1的个数_牛客题霸_牛客网 (nowcoder.com) 看本篇文章之前建议先看看该文章(讲了坑点和易错点...): JZ15 二进制中1的个数(牛客)(C语言)-CSDN博客 描述 输入一个整数 n ,输出该数32位二进制表示中1的个数。...数据范围:−2^31<=n<=2^31−1 即范围为:−2147483648<=n<=2147483647 示例1 输入: 10 返回值: 2 说明: 十进制中10的32位二进制表示为0000 0000...示例2 输入: -1 返回值: 32 说明: 负数使用补码表示 ,-1的32位二进制表示为1111 1111 1111 1111 1111 1111 1111 1111,其中32个1 法一: //...:JZ15 二进制中1的个数(牛客)(C语言)-CSDN博客 int NumberOf1(int n ) { long long flag=2147483648; int count=0

    7810

    突破性进展:在 Elasticsearch 和 Lucene 中应用更好的二进制量化 (BBQ) 实现高效向量搜索

    更好的二进制量化 (BBQ) 在 Elasticsearch 和 Lucene 中的应用嵌入模型输出的 float32 向量通常过大,不利于高效处理和实际应用。...在这篇博客中,我们将探讨 BBQ 在 Lucene 和 Elasticsearch 中的应用,重点关注召回率、高效的按位操作和优化存储,以实现快速、准确的向量搜索。什么是“更好的”二进制量化?...在 Elasticsearch 8.16 和 Lucene 中,我们引入了所谓的“更好的二进制量化”。...这显著提高了搜索质量,同时不会增加存储成本。按位操作实现快速搜索。查询向量被量化并转换为允许高效按位操作的方式。使用更好的二进制量化进行索引索引过程很简单。请记住,Lucene 构建单独的只读段。...因此,当向量添加到图中时,我们首先:获取存储在临时文件中的已量化查询向量。使用现有的比特向量正常搜索图。一旦有了邻居,多样性和反向链接评分可以使用先前的 int4 量化值完成。

    19211

    【C语言指南】计算整数的二进制位中1的个数 (三种方式)

    一、文章简介 注:如果没有特别说明,本文所提及的整数为有符号整型,即 int 类型 本文介绍求整数二进制位的1的个数的三种方式,三种方式在运算效率上差异不大,根据自己使用习惯和实际情况灵活运用即可 1....取模 配合 整除 的方式 这种方法的原理是利用十进制到二进制的转换过程—— 十进制数取模2得到的余数就是二进制位的最后一位 再将该数除2就将二进制位去掉一位 循环直到该数等于0时,也就是二进制位不再含有...,这样就可以判断最右边一位二进制位是否是1 再让输入的数字右移一位,对下一位二进制位进行判断 将上述过程放在for循环中,第一次右移0位,第二次右移1位,直到右移31位。...统计1的个数,返回 #include //第二种方式 int Num2(int n) { int count = 0; for (int i = 0; i < 32; i++)...这种方法比较巧妙,原理是 将输入的数字 n 与n-1进行按位与操作,每次会去掉一位二进制位的1 将上述过程放在循环中进行,直到所有二进制位的1被去掉,循环结束,统计1的个数 #include<stdio.h

    22110

    【C++】C++ 类中的 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

    一、全局函数 与 成员函数 相互转化 1、成员函数转为全局函数 - 多了一个参数 C++ 编译器 , 在编译阶段会将 C++ 类的 成员函数 转为 全局函数 , 转换时 , 会 增加一个参数到参数列表开始为止...height; // 身高 }; 此时就可以使用默认构造函数 , 创建 Student 对象 ; 三、返回匿名对象与返回引用 ---- 在上面的章节中 , 将 两个 Student 对象相加 ,...返回的是一个匿名对象 , 该匿名对象 是在 成员函数 中新创建的对象 ; // 成员函数中, 将两个 Student 对象相加 // 全局函数 转为 成员函数 , 少了一个参数 // 返回一个新...return s; } 如果不返回新的对象 , 而是将 两个 对象相加 , 最终结果累加到 本对象中 , 则返回 Student 引用即可 ; // 成员函数中, 将两个 Student 对象相加.../ 成员函数中, 将两个 Student 对象相加 // 全局函数 转为 成员函数 , 少了一个参数 // 两个 对象相加 , 最终结果累加到 本对象中 // 注意此处 : 函数重载 不以 返回值为标准

    23820

    C#调用SQL中的存储过程中有output参数,存储过程执行过程中返回信息

    C#调用SQL中的存储过程中有output参数,类型是字符型的时候一定要指定参数的长度。不然获取到的结果总是只有第一字符。本人就是由于这个原因,折腾了很久。在此记录一下,供大家以后参考!...RoleName nvarchar(10), @Description nvarchar(50), @RoleID int output AS DECLARE @Count int -- 查找是否有相同名称的记录...command.Parameters.Add("@Description", SqlDbType.NVarChar, 50); command.Parameters.Add("@RoleID", SqlDbType.Int, 4); // 返回值...command.Parameters.Add("Returnvalue", SqlDbType.Int, 4, // Size ParameterDirection.Returnvalue, false...permission.PermissionName; command.parameters["@Description"].value = permission.Description; // 可以返回新的

    3.2K70

    C#版 - 剑指offer 面试题10:二进制中1的个数 题解

    剑指offer 面试题10:二进制中1的个数 二进制中1的个数 提交网址: http://www.nowcoder.com/practice/8ee967e43c2c4ec193b040ea7fbb10b8...tpId=13&tqId=11164 参与人数:7222  时间限制:1秒   空间限制:32768K 题目描述 输入一个整数,输出该数二进制表示中1的个数。...3、[+0]补=[-0]补=0x00000 如果用4个字节来表示-7~8,则-3的在计算机中的表示是1101(原码为1011),则-2的在计算机中的表示是1110(原码为1010),-1在计算机里用二进制表示就是全...1(或 不处理,因为0的二进制补码中没有1)。...另一相关的位运算知识点: n=n&(n-1)==0 可以用来判断n是否为2的幂次方(即:n中除符号位以外只有一个1,其他bit均为0) 相关链接: c++ - How does this line work

    83300

    【C语言】求一个整数的二进制序列中1的个数的三种方法

    方法一:逐位%2法 该方法的初步测试代码如下: int NumberOf1(int n) { int count = 0; while (n) { if (n % 2 == 1)...{ count++; } n = n / 2; } return count; } 众所周知,数据在内存里以补码的形式存储,这是为了简化计算机的结构设计...因此在计算机系统中,数值一律用补码来表示和存储。...原理图解: 该方法图解如下: 测试运行: 原理图解如上,接下来运行测试一下: 测试正数:输入15 测试0:输入0 可以看到,程序测试非负数都是没有问题的,但是当测试到负数时就会这样: 测试负数:输入-...6  可以看到,正数和0的测试都没有问题,但是负数却显示为0,我们来看看问题出在哪里了: 强制转换后函数代码如下: int NumberOf1(unsigned int n) { int count

    9510

    Linux命令(31)——find命令

    对于find来说,一个非常重要的概念:find的搜索机制是根据表达式返回的true/false决定的,每搜索一次都判断一次是否能确定最终评估结果为true,只有评估的最终结果为true才算找到,并切入到下一个搜索点...:将find指令的返回值皆设为false; -type [c]:查找指定类型的文件,类型c可取值: b - 块设备文件。...file中; -fprint [file]:总是返回true,将找到的文件的全路径输出到指定的文件file中; -fprint0 [file]:类似于-print0,将结果写入文件file; -fprintf...[file] [format]:类似于-printf,将结果写入指定的文件file; -ls:总是返回true。..."将被认为是ab和c.txt两个文件,如不想被此分解影响,可考虑使用"-print0"替代"-print"将所有换行符替换为"\0"; -print0:总是返回true。

    2K50
    领券