二分搜索有两种常见的实现方法:递归实现、迭代实现。其中递归实现的代码量是最少的(但计算机执行的代码却很多哦)。
public static int binarySearch(int a[], int x, int left, int right) {
if (left > right) {
return -1;
} else {
int mid = (left + right) / 2;
if (x == a[mid]) {
return mid;
}
if (x > a[mid]) {
return binarySearch(a, x, mid + 1, right);//***
} else {
return binarySearch(a, x, left, mid);//***
}
}
}
代码中有注释***的两句就是递归调用啦!我任然记得:老师说每届学生都纠结于这两句里的return能不能删掉。我的理解是:binarySearch是一个有返回值的函数。这就会有两个要求:1、执行该函数时,得保证它有返回值;2、调用该函数时,一般要有个与它返回值类型相同类型的变量接收它(有些时候返回值就是一个标识,这种情况除外)。
显然要求2可以说明问题了,但对于正在纠结的人可能说服力不是那么大。那么,就请继续仔细看看代码会如何执行。
public static int binarySearch(int a[], int x, int left, int right) {
if (left > right) {
return -1;
} else {
int mid = (left + right) / 2;
if (x == a[mid]) {
return mid;
}
if (x > a[mid]) {
binarySearch(a, x, mid + 1, right);//***
} else {
binarySearch(a, x, left, mid);//***
}
// ***statement ***
}
}
我们清楚这个递归不会是死递归,在最后一次调用(假设为第N次调用)中,return -1; 或return mid; 会被执行。这样回到了第 N-1 次调用的函数体,代码接着往下执行到 ***statement*** 接着第 N-1 次调用走完了。恍然大悟,这次调用是没有返回值的。
至此,道理讲明了。作为个人学习,顺便贴上些其它的实现代码。
public static int BinarySearch(int[] array, int key)
{
int low = 0;
int high = array.Length - 1;
int middle = 0;
while (low <= high)
{
middle = (low + high) / 2;
int middleValue = array[middle];
if (middleValue < key)
{
low = middle + 1;
}
else if (middleValue > key)
{
high = middle - 1;
}
else
{
return middle;
}
}
return -(low + 1);
}
此代码来自CSDN博客:http://blog.csdn.net/xzjxylophone/archive/2009/10/23/4714326.aspx
public static int BinarySearchIteration(int[] array, int key)
{
int low = 0;
int high = array.Length - 1;
int middle = 0;
while (low < high)
{
middle = (low + high) / 2;
if (key > array[middle])
{
low = middle + 1;
}
else
{
high = middle;
}
}
if (low > high)
{
return -1;
}
else
{
if (key == array[low])
{
return low;
}
else
{
return -1;
}
}
}
本代码来自CSDN博客:http://blog.csdn.net/xzjxylophone/archive/2009/10/23/4714326.aspx
分享到:
相关推荐
二分搜索,也被称为折半查找,是一种在...通过理解二分搜索的递归和非递归实现,我们可以更好地掌握分治策略,并将其应用到其他算法中,如快速排序、归并排序等。同时,这也是提升编程能力,理解和解决问题的重要步骤。
本实验重点探讨了二分检索(又称二分查找)的递归实现,这是一种在有序数组中寻找特定元素的有效方法。在此,我们将深入探讨二分检索的基本概念,递归的原理以及如何在C++中实现这一算法。 二分检索的核心思想是在...
在C++中,这两个实现可能分别对应于`二分查找递归代码.cpp`和`二分查找非递归代码.cpp`中的内容。在实际应用中,根据具体场景和性能需求,可以选择合适的实现方式。需要注意的是,二分查找的前提是输入数组必须是...
二、深度搜索+递归实现银行家算法 深度搜索+递归是实现银行家算法安全序列全搜索的关键思想。该算法的主要思想是使用递归和深度优先搜索来搜索所有可能的安全序列。该算法的主要步骤是: 1. 初始化 système 状态...
分别用递归和非递归方法实现二分查找算法 的完整程序,indexof()返回的是循环实现的二分法查找,getindex()实现的是递归算法实现的二分法查找。
**递归实现**:二分查找的递归版本也是直接根据上述步骤实现。每次将查找范围减半,直到找到目标元素或确定元素不存在。 **非递归实现**:非递归实现通常使用循环,逐步调整查找区间的上下界,直到找到目标元素或...
自己写的用递归实现的背包问题,欢迎各位高手指正。
在本主题中,我们将深入探讨快速选择的非递归和递归实现。 ### 快速选择的基本思想 快速选择的核心在于“分区”操作。首先,我们随机选择一个基准元素,然后将数组分为两部分:小于基准的元素和大于或等于基准的...
在Java中,二分检索的递归实现通常会涉及以下步骤: 1. **定义递归函数**:首先,我们需要定义一个接受数组、目标值、起始索引和结束索引作为参数的递归函数。例如,可以命名为`binarySearchRecursively`。 2. **...
//二分查找,递归实现 int binarySearch(int a[],int low,int high,int key) { //查找某元素是否在数组中,若存在,则返回下标,否则返回-1; int mid=(low+high)/2; if(low>high){ return -1;//该元素不...
二分查找的递归与非递归实现(java版)
Java二分查找递归算法
本篇将深入探讨如何使用递归算法在C语言中实现Linux目录树的遍历。 首先,我们需要理解递归的概念。递归是一种解决问题的方法,它通过调用自身来解决子问题,直到达到基本情况。在处理目录树时,我们可以把根目录视...
本资源是数据结构中利用非递归法实现n皇后问题的一个C++代码,仅供参考,欢迎指正
#### 二、递归算法在迷宫问题中的应用 接下来,我们将通过一个具体的例子——走迷宫问题,来进一步了解递归算法的应用。 ##### 2.1 迷宫问题定义 假设有一个由0和1组成的二维数组,其中1代表可以通过的道路,0...
根据给定的文件信息,我们可以总结出以下关于“递归实现回文判断”的知识点: ### 一、回文概念 回文是指一个字符串从左到右读和从右到左读都是一样的字符串。例如,“abcba”、“madam”等都是回文字符串。 ### ...
在C++中实现二分搜索,通常涉及以下步骤: 1. **初始化边界**:设定搜索范围的初始边界,通常为数组的第一个元素和最后一个元素的索引。 2. **检查有效性**:确保搜索范围不为空,即开始索引小于等于结束索引。 3. ...
本文将详细介绍如何使用C++中的递归技术来实现字符串的逆序操作。逆序字符串是一个常见的编程问题,在多种场景下都有应用,例如文本处理、算法设计等。通过递归方法解决此问题不仅能加深对递归的理解,还能提高解决...
总之,递归实现的中间代码生成器是编译器设计中的关键组件,它不仅简化了语法分析的实现,还提供了优化和目标代码生成的基础。通过本文的解析,希望读者能够对中间代码生成的递归实现有更深的理解。
在Python3中实现非递归二分查找,首先需要一个已经排序的列表。以下是实现该算法的关键步骤: 1. 初始化查找范围:设置查找区间的左右边界,通常是`[0, len(array) - 1]`。 2. 当左边界小于等于右边界时,进入循环...