C++二分查找(折半查找)算法实例详解

 更新时间:2017年05月11日 14:23:23   作者:难免有错_  
这篇文章主要介绍了C++二分查找(折半查找)算法,结合实例形式详细分析了二分查找算法的原理、思想、实现方法与相关操作技巧,需要的朋友可以参考下

本文实例讲述了C++二分查找(折半查找)算法。分享给大家供大家参考,具体如下:

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。

因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

二分查找思想

首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;

否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。

重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

基本算法C语言实现代码:

int binary_search(int arr[], int len, int elem)
{
  int low = 0;
  int high = len - 1;
  while (low <= high)
  {
    int mid = (low + high) / 2;
    if (elem == arr[mid]){   //相等,返回mid
      return mid;
    }
    else if (elem > arr[mid]){
      low = mid + 1;  //元素比区间中间元素大,取区间中间元素的下一个元素作为新区间起始位置
    }
    else{
      high = mid - 1; //元素比区间中间元素小,取区间中间元素的上一个元素作为新区间结束位置
    }
  }
  return -1;
}

添加检测是否是已排好序数组的程序实例

#include <iostream>
using namespace std;
int binary_search(int arr[], int len, int elem)
{
  int low = 0;
  int high = len - 1;
  while (low <= high)
  {
    int mid = (low + high) / 2;
    if (elem == arr[mid]){
      return mid;
    }
    else if (elem > arr[mid]){
      low = mid + 1;
    }
    else{
      high = mid - 1;
    }
  }
  return -1;
}
//检测是否排好序
int is_sorted(int arr[], int len)
{
  int sorted = 1;
  for (int i = 0; i < len - 1; i++)
  {
    sorted = sorted && arr[i] <= arr[i + 1];
  }
  return sorted;
}
int main()
{
  int arr[] = { 1, 3, 5, 7, 9, 11, 12, 15, 18, 23, 25, 26 };
  int len = sizeof(arr) / sizeof(int);
  int pos;
  int sorted = is_sorted(arr, len);
  if (sorted)
  {
    pos = binary_search(arr, len, 26);
    cout << "pos = " << pos << endl;
  }
  system("pause");
}

运行结果:

pos = 11
请按任意键继续. . .

希望本文所述对大家C++程序设计有所帮助。

相关文章

  • C语言如何计算字符串长度

    C语言如何计算字符串长度

    这篇文章主要介绍了C语言如何计算字符串长度问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C/C++混合编程之extern “C”的使用示例

    C/C++混合编程之extern “C”的使用示例

    这篇文章主要给大家介绍了关于C/C++混合编程之extern “C”使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • 详解如何使用C++写一个线程安全的单例模式

    详解如何使用C++写一个线程安全的单例模式

    这篇文章主要为大家详细介绍了如何使用C++写一个线程安全的单例模式,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2022-10-10
  • C++重载的奥义之运算符重载详解

    C++重载的奥义之运算符重载详解

    函数的重载是指利用相同的函数名设计一系列功能相近,但是功能细节不一样的函数接口;因此运算符重载也是指对于同一个运算符来说,它可以用于实现不同的功能。下面就一起来理解下运算符重载的应用吧
    2023-04-04
  • MFC命名规则汇总

    MFC命名规则汇总

    这篇文章主要介绍了MFC命名规则,对于初学者而言需要牢固掌握这类规则,需要的朋友可以参考下
    2014-07-07
  • Opencv EigenFace人脸识别算法详解

    Opencv EigenFace人脸识别算法详解

    这篇文章主要为大家详细介绍了Opencv EigenFace人脸识别算法的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • C++文件读写代码分享

    C++文件读写代码分享

    本文给大家分享的是2个C++实现文件读写的代码,都非常的简单实用,有需要的小伙伴可以参考下。
    2015-07-07
  • C++实现连连看消除算法

    C++实现连连看消除算法

    这篇文章主要为大家详细介绍了C++实现连连看消除算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 详解C语言中strcpy函数与memcpy函数的区别与实现

    详解C语言中strcpy函数与memcpy函数的区别与实现

    这篇文章主要介绍了C语言中字符串拷贝函数(strcpy)与内存拷贝函数(memcpy)的不同及内存拷贝函数的模拟实现,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-12-12
  • 浅谈int8_t int64_t size_t ssize_t的相关问题(详解)

    浅谈int8_t int64_t size_t ssize_t的相关问题(详解)

    下面小编就为大家带来一篇浅谈int8_t int64_t size_t ssize_t的相关问题(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03

最新评论