查找算法之二分查找的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日

相关文章

  • C++简单集合类的实现方法

    C++简单集合类的实现方法 什么是集合类? 集合类是数据结构中的一种,用来存储一组相同类型的数据项。集合类可以快速的对其中的数据进行添加、删除、查找、排序等操作。在C++中,STL中的集合类就是其中之一。 集合类实现原理 在实现一个集合类时,我们可以使用数组、链表、哈希表等数据结构。不过,在这里我们使用了一个常用的数据结构:红黑树。 红黑树是一种自平衡二叉搜…

    C 2023年5月23日
    00
  • C++常量详解二(常量形参,常量返回值,常量成员函数)

    C++常量详解二(常量形参、常量返回值、常量成员函数) 常量形参 在 C++ 中,函数参数也可以定义为常量。这意味着该参数的值不能被修改。我们可以使用 const 关键字在函数参数中声明它为常量。 void func(const int num) { // 禁止修改 num 的值 } 常量返回值 在 C++ 中,有时我们需要返回一个常量值。这可以通过在函数声…

    C 2023年5月22日
    00
  • C语言模式实现C++继承和多态的实例代码

    为了实现C++的继承和多态概念,可以在C语言中定义结构体来模拟类的概念,通过指针来实现函数的虚函数(相当于C++中的纯虚函数)。下面我将讲解具体的步骤和示例代码。 1. 声明父类结构体 先用结构体来定义一个父类,并声明父类的成员变量和方法。注意在结构体内部也要使用指针来模拟虚函数表的概念。 typedef struct Parent { int m_val;…

    C 2023年5月23日
    00
  • C 语言基础之初识 C 语言常量

    下面是关于初识 C 语言常量的完整攻略。 什么是 C 语言常量 在 C 语言中,常量指的是固定不变的值,即程序运行期间不会改变的数据。常量可以分为两类:字面常量和符号常量。 字面常量 字面常量也叫直接常量,是指用数字、字符、字符串等直接表示的常量。 比如,以下是一些字面常量的例子: 42 // 整型常量 3.14 // 浮点型常量 ‘A’ // 字符型常量 …

    C 2023年5月24日
    00
  • vc6.0中c语言控制台程序中的定时技术(定时器)

    在VC6.0的控制台程序中,我们可以通过定时器技术来实现在指定的时间间隔内执行某个代码段的功能。下面是使用定时器的完整攻略: 步骤1:创建控制台程序 首先,我们需要创建一个控制台程序项目,并在main函数中添加代码,以便我们在程序执行时可以看到输出结果。 #include <stdio.h> int main() { printf("程…

    C 2023年5月22日
    00
  • windows下vscode使用cmake的方法

    下面是详细的讲解“Windows下VSCode使用CMake的方法”的完整攻略。 1. 安装环境 首先需要安装以下软件: Visual Studio Code CMake C/C++编译器 其中CMake和C/C++编译器可以使用MinGW-w64或者Visual Studio。 2. 创建CMake项目 在VSCode中打开一个空白的文件夹,然后使用以下命…

    C 2023年5月23日
    00
  • IIS解析json的配置方法汇总

    当使用IIS托管网站时,如果需要让网站支持解析输入的json数据,需要对IIS进行相应的配置。以下是配置IIS解析json数据的具体步骤: 步骤一:安装ASP.NET Core Module 在配置IIS支持json数据解析之前,我们需要确保系统中已安装了ASP.NET Core Module。可以通过以下步骤进行安装: 打开服务器管理器,在左侧导航栏选择“…

    C 2023年5月23日
    00
  • Java实现生成JSON字符串的三种方式分享

    以下是 “Java实现生成JSON字符串的三种方式分享” 的完整攻略: 一、使用Java的JSONObject实现 在Java中,可以使用JSONObject类来生成JSON字符串,该类定义了用于创建和操作JSON对象的方法。下面是一个示例: import org.json.*; public class JSONDemo { public static v…

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