`
shazhifeng
  • 浏览: 125166 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

二分搜索算法(折半查找)原理以及递归(recuition),迭代(iteration)的两种实现源代码

阅读更多

折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。

【基本思想】

将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。

二分搜索法的应用极其广泛,而且它的思想易于理解。第一个二分搜索算法早在1946 年就出现了,但是第一个完全正确的二分搜索算法直到1962年才出现。Bentley在他的著作《Writing Correct Programs》中写道,90%的计算机专家不能在2小时内写出完全正确的二分搜索算法。问题的关键在于准确地制定各次查找范围的边界以及终止条件的确定,正确地归纳奇偶数的各种情况,其实整理后可以发现它的具体算法是很直观的。

C++描述

template<class Type> 
int BinarySearch(Type a[],const Type& x,int n)  
{  
int left=0; 
int right=n-1; 
while(left<=right){  
int middle=(left+right)/2; 
if (x==a[middle]) return middle; 
if (x>a[middle]) left=middle+1; 
else right=middle-1; 
}  
return -1; 
}

 

递归实现(recuition)

template<class Record, class Key> 
int binary_search( Record * r, const int & low, const int & high, const Key & k ) 
{ 
int mid = (low + high)/2; 
if( low < high ) 
{ 
  if( k <= r[mid] ) 
   binary_search( r, low, mid, k );  
  else 
   binary_search( r, mid+1, high, k ); 
} 
else if( low == high ) 
{ 
  if( k == r[mid] ) 
   return low; 
  else 
   return -1; 
} 
else 
  return -1; 
}

 迭代实现(iteration)

template<typename Record, typename Key> 
int binary_search( Record * r, const int & size, const Key & k ) 
{ 
int low=0, high=size-1, mid; 
while( low < high ) 
{ 
  mid = (low + high) / 2; 
  if( k > r[mid] ) 
   low = mid + 1; 
  else 
   high = mid; 
} 
if( low > high ) 
  return -1; 
else 
{ 
  if( k == r[low] ) 
   return low; 
  else 
   return -1; 
} 
}

  

分享到:
评论

相关推荐

    折半查找的递归算法

    递归版本的折半查找算法与非递归版本的主要区别在于使用了函数调用自身的方式来实现查找区间对半分割的过程。递归版本通常更简洁,但可能会增加程序的调用栈开销。 #### 四、C语言实现 以下是一个使用C语言实现...

    折半查找的递归与非递归算法

    折半查找,又称二分查找,是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将数组分成两个部分,每次比较中间元素与目标值,根据比较结果缩小搜索范围。如果中间元素等于目标值,则查找成功;如果中间元素...

    java 快速排序 折半查找的界面实现 (递归与分治法)

    在Java编程中,这两种算法都可以通过递归和分治策略进行实现,以提高效率和可读性。下面我们将深入探讨这两个算法的原理、实现方式以及它们在Java中的应用。 首先,快速排序是一种高效的排序算法,由C.A.R. Hoare在...

    Java代码递归的折半查找算法

    递归版本的折半查找算法是一种高效的搜索技术,适用于已排序的数组。它的工作原理是将问题分解为更小的问题,直到找到目标值或确定目标值不存在于数组中为止。这种策略在计算机科学中称为“分而治之”。 #### 折半...

    分别用递归和非递归方法实现二分查找算法 的完整程序

    分别用递归和非递归方法实现二分查找算法 的完整程序,indexof()返回的是循环实现的二分法查找,getindex()实现的是递归算法实现的二分法查找。

    非递归折半查找

    非递归查找的简单C语言程序,供初学者参考一下,哈哈。

    折半(二分)查找的c++代码(递归和非递归)实现

    二分查找,也称为折半查找,是一种在有序数组中搜索特定元素的高效算法。它利用了数组的线性特性,每次将搜索范围减半,从而显著减少了查找次数。二分查找在计算机科学中有着广泛的应用,特别是在大量数据处理和...

    折半查找(二分查找)折半查找(二分查找)折半查找(二分查找)

    折半查找(二分查找)是一种高效的查找算法,对于顺序存储的有序表,可以快速地找到指定的关键字记录。该算法的基本思想是,每次比较给定值 K 与中间位置记录的关键字值,并根据比较结果确定下一步的查找范围,直到...

    折半查找算法及matlab代码实现

    该算法的基本思想是通过不断将搜索范围减半来查找目标值,因此也被称为二分查找。与线性查找相比,折半查找在最坏情况下的时间复杂度为O(log n),而线性查找的时间复杂度为O(n)。 **折半查找算法步骤如下:** 1. *...

    数据结构查找、排序、二分查找、折半查找算法

    文件名中的"Sun数据结构第8章查找(第22-25讲).ppt"和"Sun数据结构第9章排序(第25-27讲).ppt"表明,内容可能详细涵盖了查找算法的各个方面,包括二分查找的原理、实现和优化,以及排序算法的介绍、实现步骤和性能...

    折半查找算法

    折半查找算法(Binary Search),也称为二分查找算法,是一种在有序数组中查找特定元素的高效算法。它的基本思想是在有序数组中通过比较中间元素与目标值来逐步缩小查找范围,直到找到目标值或查找范围为空为止。 #...

    折半查找算法的改进和程序实现

    折半查找算法是一种在有序数组中寻找特定元素的搜索算法,其基本思想是将数组分为两半,通过比较中间元素和目标值来缩小搜索范围。然而,传统的折半查找在某些情况下并不一定是效率最高的方法。通过对查找算法的改进...

    静态查找表。实现有序表的折半查找算法

    本篇文章将详细解释如何实现一个静态查找表,并利用折半查找算法(也称二分查找算法)来查询表中的数据。 #### 一、静态查找表的概念 静态查找表是一种只进行查找操作而不允许插入或删除操作的数据结构。其主要...

    折半(二分)查找算法C语言源程序.zip

    折半查找,又称二分查找,是一种在有序数组中查找特定元素的搜索算法。它的基本思想是通过比较中间元素和目标值,将搜索范围不断缩小一半,直到找到目标元素或者搜索范围为空。这个方法非常高效,尤其对于大型有序...

    zhebanchazhao.rar_折半 查找_折半查找_折半查找算法_查找_查找算法

    折半查找,也被称为二分查找,是一种在有序数组中搜索特定元素的高效算法。它的基本思想是将数组分成两半,然后比较中间元素与目标值,根据比较结果决定是在左半部分还是右半部分继续查找。这个过程一直持续到找到...

    C语言实现顺序表的顺序查找和折半查找

    在上面的代码中,我们实现了两种折半查找算法:非递归算法和递归算法。在main函数中,我们首先输入数组的元素个数和数组元素,然后输入要查询的数,并使用BinSearch1或BinSearch2函数来查找该元素。 本文详细介绍了...

    请写出对有序表进行折半查找的非递归算法.doc

    在计算机科学领域,折半查找(又称二分查找)是一种高效的查找算法,它的工作原理是在一个有序数组中查找特定元素的位置。对于有序表进行折半查找的非递归算法,我们可以基于给定代码进行详细的分析。 1. **初始化...

    折半查找算法在顺序表中插入一个元素讲解.pdf

    折半查找算法的基本思想是将整个查找区间分为两半,然后通过比较中间元素与要查找的元素的大小关系来确定下一步的查找方向。如果要查找的元素小于中间元素,则继续在左半区间查找,否则继续在右半区间查找。重复这个...

Global site tag (gtag.js) - Google Analytics