stl_algorithm算法之二分法查找

二分法查找:

7.60、template <class ForwardIterator, class T>
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val)
{
  ForwardIterator it;
  iterator_traits < ForwardIterator>::difference_type count, step;
  count = distance(first,last);
  while (count > 0)
  {
    it = first;
    step = count/2;
    advance (it,step);
    if (*it<val) { // or: if (comp(*it,val)), for version (2)
      first=++it;
      count -= step+1;
    }
    else count = step;
  }
  return first;
}

7.61、template <class ForwardIterator, class T>
ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, const T& val)
{
  ForwardIterator it;
  iterator_traits<ForwardIterator>::difference_type count, step;
  count = std::distance(first,last);
  while (count>0)
  {
    it = first; step=count/2; std::advance (it,step);
    if (!(val<*it)) // or: if (!comp(val,*it)), for version (2)
    {
      first = ++it;
      count -= step+1;
    }
    else count=step;
  }
  return first;
}

7.62、template <class ForwardIterator, class T>
pair<ForwardIterator,ForwardIterator>
equal_range (ForwardIterator first, ForwardIterator last, const T& val)
{
  ForwardIterator it = std::lower_bound (first,last,val);
  return std::make_pair ( it, std::upper_bound(it,last,val) );
}

7.63、template <class ForwardIterator, class T>
bool binary_search (ForwardIterator first, ForwardIterator last, const T& val)
{
  first = std::lower_bound(first,last,val);
  return (first!=last && !(val<*first));
}
时间: 2024-09-29 08:04:49

stl_algorithm算法之二分法查找的相关文章

顺序表的冒泡排序算法及二分法查找代码实现

本文主要实现了比较经典的冒泡排序算法(对已经有序或者基本有序的顺序表复杂度大大降低),和二分法查找,各位看官看代码吧 //冒泡排序算法及二分法查找 #include "stdio.h" typedef struct { int key; }SSTable_Elem_Type; typedef struct { SSTable_Elem_Type*elem; int length; }SSTable_Typedef; void Bubble_Sort(SSTable_Typedef*ST

python的算法:二分法查找(1)

1.什么是二分法查找: 1.从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: 2.如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较. 3.如果在某一步骤数组为空,则代表找不到. 每次都是i减半查找,其时间消耗为O(logn) 最简单的一个循环算法就是: def binary_search_loop(lst,value): low,high=0,len(value)-1 while low<=high: mid=

I学霸官方免费教程二十九:Java查找算法之二分法查找

二分法查找算法 基本步骤:    第一步:获取数组中间的下标    第二步:中间下标处的值和目标值比较,如果目标值大,说明要找的值在数组的后边一半中    第三步:再次获取数组右边一半的中间下标    第四步:再次用获得的中间下标和目标值进行比较    后续步骤以此类推,这样每次查找都在"半份"数据中进行,所以又叫折半查找.这也是为什么使用二分法查找之前必须要对数组进行排序的原因.如果不排序,将无法判断目标值在哪"半份"中 实例: package algorithm

冒泡算法和二分法查找

1.对一个整形数组进行冒泡排序 public  static void mp(int []a){ for(int i=0;i<a.length;i++){ for(int j=i+1;j<a.length;j++){ if(a[i]<a[j]){ temp = a[i]; a[i] = a[j]; a[j] = temp; } } } } 2.二分法查找(针对已排序数组) public static int ef(int []a, int tag){ int low = 0; int h

php常用的排序算法与二分法查找

一 : 归并排序 将两个的有序数列合并成一个有序数列,我们称之为"归并".归并排序(Merge Sort)就是利用归并思想对数列进行排序.根据具体的实现,归并排序包括"从上往下"和"从下往上"2种方式. 1. 从下往上的归并排序:将待排序的数列分成若干个长度为1的子数列,然后将这些数列两两合并:得到若干个长度为2的有序数列,再将这些数列两两合并:得到若干个长度为4的有序数列,再将它们两两合并:直接合并成一个数列为止.这样就得到了我们想要的排序结果

算法学习之查找(顺序、二分法、排序二叉树以及 Hash 表)

[摘要]查找--用关键字标识一个数据元素,查找时根据给定的某个值,在表中确定一个关键字的值等于给定值的记录或数据元素.在计算机中进行查找的方法是根据表中的记录的组织结构确定的.查找功能数据处理的一个基本功能.数据查找并不复杂,但是如何实现数据又快又好地查找呢?前人在实践中积累的一些方法,值得我们好好学些一下.我们假定查找的数据唯一存在,数组中没有重复的数据存在. 1. 顺序查找 设想有一个1M的数据,我们如何在里面找到我们想要的那个数据.此时数据本身没有特征,所以我们需要的那个数据可能出现在数组

Java中的二分法查找算法

[ 什么是二分查找 ]  二分查找又称为折半查找,该算法的思想是将数列按序排列,采用跳跃式方法进行查找,即先以有序数列的中点位置为比较对象, 如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分.以此类推不断缩小搜索范围. [ 二分查找的条件 ] 二分查找的先决条件是查找的数列必须是有序的. [ 二分查找的优缺点 ] 优点:比较次数少,查找速度快,平均性能好: 缺点:要求待查数列为有序,且插入删除困难: 适用场景:不经常变动而查找频繁的有序列表. [ 算法步骤描述 ] ①

iOS 排序算法总结、二分法查找

还有一个:二分插入排序  平均时间O(n2)   稳定 1.插入排序 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环,直到全部排好顺序. 直接插入排序是稳定的.算法时间复杂度O(n2)--[n的平方] main() { int  a[10],j,i,m; for(j=1;j<10;j++) { m=a[j]; for(i=j-1;i>=0;i--) { if(a[i]<m) b

算法 - 二分法查找

什么是二分法查找 二分法查找主要是为了快速查找给定数组内,期待值在数组中的位置(下标) 二分法查找通过对整个数组取中间值,判断期待值所在的范围并缩小范围,每次查找范围折半,直到范围的边界重合,得出期待值的位置,如果找不到返回null 二分法有一个先决条件是:数组内元素必须是有序的 简单图解 给定一个包含1,3,5,7,8,9这一个元素的有序数组,求得期待值7所在的位置,下边用绿块表示指针所在位置 若是按照直接遍历的方式,绿块会从数组的第一个下标开始比较,直到7所在的下标得到结果,遍历需要4次,下