查找算法之二分查找的C++实现

查找算法之二分查找的C++实现

什么是二分查找?

二分查找(Binary Search),也叫折半查找,是一种在有序数组中查找某一特定元素的查找算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种查找算法每次比较都使搜索范围缩小一半,其时间复杂度为$O(\log n)$。

二分查找的实现过程

下面是二分查找的实现过程:

  1. 首先把数组按照大小排列,确保其是有序的。

  2. 然后选择数组的中间元素,与要查找的数进行比较。

  3. 如果相等,则查找成功,返回该元素所在的位置。

  4. 如果中间元素大于查找的元素,则在数组的左半部分继续进行二分查找。

  5. 如果中间元素小于查找的元素,则在数组的右半部分继续进行二分查找。

  6. 如果查找到最后都没有找到,则查找失败,返回-1。

二分查找的C++代码实现

int binarySearch(int arr[], int start, int end, int target) {
    while (start <= end) {
        int mid = (start + end) / 2;
        if (arr[mid] == target) {
            return mid;
        }
        if (arr[mid] > target) {
            end = mid - 1;
        } else {
            start = mid + 1;
        }
    }
    return -1;
}

上述代码中,我们使用了循环结构实现二分查找。函数的参数包括:要查找的数组、数组起始位置、数组结束位置以及待查找的元素。

二分查找的示例

下面通过两个示例,介绍二分查找的使用方法。

示例一:查找元素

假设有一个有序数组为{1, 2, 3, 4, 5, 6, 7, 8, 9},现在要查找元素5,代码如下:

#include <iostream>

using namespace std;

int binarySearch(int arr[], int start, int end, int target) {
    while (start <= end) {
        int mid = (start + end) / 2;
        if (arr[mid] == target) {
            return mid;
        }
        if (arr[mid] > target) {
            end = mid - 1;
        } else {
            start = mid + 1;
        }
    }
    return -1;
}

int main() {
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int len = sizeof(arr) / sizeof(int);
    int index = binarySearch(arr, 0, len - 1, 5);
    if (index >= 0) {
        cout << "查找成功,元素5所在位置为:" << index << endl;
    } else {
        cout << "查找失败,未找到元素5" << endl;
    }
    return 0;
}

运行上面的代码,输出结果如下:

查找成功,元素5所在位置为:4

示例二:查找符合条件的元素

假设有一个有序数组为{1, 2, 3, 3, 4, 4, 4, 5, 6, 7, 8, 9},现在要查找第一个值大于等于4的元素所在的位置,代码如下:

#include <iostream>

using namespace std;

int binarySearch(int arr[], int start, int end, int target) {
    while (start <= end) {
        int mid = (start + end) / 2;
        if (arr[mid] >= target) {
            if (mid == 0 || arr[mid - 1] < target) {
                return mid;
            } else {
                end = mid - 1;
            }
        } else {
            start = mid + 1;
        }
    }
    return -1;
}

int main() {
    int arr[] = {1, 2, 3, 3, 4, 4, 4, 5, 6, 7, 8, 9};
    int len = sizeof(arr) / sizeof(int);
    int index = binarySearch(arr, 0, len - 1, 4);
    if (index >= 0) {
        cout << "查找成功,第一个值大于等于4的元素所在位置为:" << index << endl;
    } else {
        cout << "查找失败,未找到符合条件的元素" << endl;
    }
    return 0;
}

运行上面的代码,输出结果如下:

查找成功,第一个值大于等于4的元素所在位置为:4

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:查找算法之二分查找的C++实现 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • visio中怎么插入公式? visio编辑公式的详细教程

    在 Visio 中插入公式,需要使用到 Visio 自带的公式编辑器 Equation Editor。接下来,我将为您详细介绍在 Visio 中如何插入和编辑公式的步骤。 步骤1:打开 Equation Editor 在 Visio 中将光标放在所要插入公式的位置,然后打开 Equation Editor 的方法有两种: 使用快捷键“Alt”+“=”,或者 …

    C 2023年5月22日
    00
  • C语言传递函数指针

    我们来详细讲解一下C语言中传递函数指针的完整使用攻略。 什么是C语言函数指针? 在C语言中,函数指针是指向函数的指针变量。由于函数本身在内存中也有一个地址,因此可以用指针来指向一个函数。 函数指针的声明格式如下: typedef 返回值类型 (*函数名)(参数类型1, 参数类型2, …); 其中,typedef是用来定义类型别名的关键字,返回值类型是指被…

    C 2023年5月9日
    00
  • 浅析C语言中assert的用法

    浅析C语言中assert的用法 什么是assert? assert是一个宏定义,一般用于程序调试时,验证程序中的某些假设,并在假设为false时终止程序执行。一般情况下,assert被用于测试函数的参数是否正确,或者程序是否处于正确的状态。 assert的使用方法 assert头文件在C语言中是,调用assert需要两个参数,第一个参数是需要验证的假设表达式…

    C 2023年5月23日
    00
  • 详解c++良好的编程习惯与编程要点

    详解C++良好的编程习惯与编程要点 C++是一门广泛使用的编程语言,它的语法和特性非常丰富,同时也具有很高的灵活性。但是,如果我们没有遵循一些良好的编程习惯和编程要点,将会使我们的代码难以阅读和维护。下面我们将详细讲解C++良好的编程习惯与编程要点。 1. 命名规范 良好的命名规范是写出易读易懂的代码的关键。我们应该遵循以下命名规范: 变量名和函数名应该是有…

    C 2023年5月22日
    00
  • C语言实现数独游戏

    C语言实现数独游戏攻略 介绍 数独是一种逻辑填数游戏,通过在九宫格中填入数字1-9,使得每行、每列、每个九宫格内的数字都没有重复。C语言可以实现数独游戏,并对玩家的答案进行检测。 步骤 1. 定义九宫格 首先需要定义一个二维数组来表示数独的九宫格。在C语言中,可以使用如下代码定义一个9×9的九宫格: int grid[9][9]; 2. 初始化九宫格 在定义…

    C 2023年5月23日
    00
  • PHP局部异常因子算法-Local Outlier Factor(LOF)算法的具体实现解析

    PHP局部异常因子算法-Local Outlier Factor(LOF)算法的具体实现解析 什么是Local Outlier Factor(LOF)算法 Local Outlier Factor,即局部异常因子算法,是一种用于检测数据集中的异常值的非监督学习算法。它可以发现在数据集中位置比较突出且与其相邻数据点比较远的点。 LOF算法可以对离散数据集进行处…

    C 2023年5月22日
    00
  • 浅谈c++ vector和map的遍历和删除对象

    浅谈c++ vector和map的遍历和删除对象 概述 在c++的stl中,vector和map是常用的数据结构。它们都有遍历和删除对象的需求,下面将详细介绍如何使用c++ vector和map完成遍历和删除对象的操作。 vector的遍历和删除元素 遍历vector 遍历vector可以使用迭代器,得到vector的每个元素。 #include <i…

    C 2023年5月22日
    00
  • C语言代码实现飞机大战

    下面将详细讲解“C语言代码实现飞机大战”的完整攻略。 1. 准备工作 首先,需要安装一个C语言编译器,常用的有gcc和clang。具体安装方法可以在官网上查找。 2. 整体框架 飞机大战是一个2D画面的游戏,所以我们可以使用C语言的图形库来实现。常用的图形库有SDL、OpenGL等,这里我们以SDL为例,来讲解整体框架。 2.1 初始化SDL SDL_Ini…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部