`
yuchen_johnson
  • 浏览: 4779 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

庞果网的二分查找挑战

阅读更多
上周末在ITEYE上看到一个标题‘在充足时间下,只有百分之二十程序员能成功完成的二分查找’,当时心想,对于算法虽然基础不是很精通,但是基础的还没问题,抱着好奇心点了进去,原来是一个编程挑战,题目当然是实现二分查找,还有一个附属条件是当有多个值相同时,返回最小下标,看看时间,一个小时呢,心想应该很快能够实现的,当然首先想到是写一个递归算法,写递归算法首先的是要确定出口,当时很自然的觉得应该是开始下标应该小于等于结束下标,于是就开始实现了,结果到后来发现查找数组里有的数据时没有问题,查找没有的值时会出现栈溢出,发觉自己还是心理素质不够好,当时就不淡定了,想着自己的想法应该没有问题,后来时间快到了,就勉强提交了只能查找存在数值的版本上去。最近这周任务比较紧,也就没来得及细细思索这个问题,不过一直挂在脑子里,今天下午终于有点时间,于是挤出来重新实现了一遍,发现问题就在递归出口上,其实当时也应该想到栈溢出的一种可能就是递归无出口的问题,于是最终去掉了首尾下标相等的条件,也就实现了查找了,当然重复值返回最小下标应该是比较简单了,在找到查找的值时再向前来一次二分查找就可以了。
package com.johnson.algo;

public class BinarySearch {
	public static int search(int[] arr, int start, int end, int val) {
		if (start < end) {
			int mid = start + ((end - start) >> 1);
			if (val == arr[mid]) {
				int k = -1;
                                //这里再进行一次二分查找即可实现返回重复值的最小下标
				if ((k = search(arr, start, mid, val)) != -1) {
					return k;
				}
				return mid;
			} else if (val < arr[mid]) {
				return search(arr, start, mid, val);
			} else {
				return search(arr, mid + 1, end, val);
			}
		}
		return -1;
	}

	public static void main(String[] args) {
		int[] arr = { 0, 3, 4, 6, 11, 11, 11, 87 };
		System.out.println(search(arr, 0, arr.length - 1, 11));
	}
}
分享到:
评论

相关推荐

    二分查找_测试

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

    二分查找算法

    二分查找算法 二分查找算法是一种高效的查找算法,适用于已经排好序的数组或链表中查找特定的元素。该算法的时间复杂度为O(log n),远远优于顺序查找算法的O(n)。 二分查找算法的基本思想是将数组或链表分成两个...

    二分查找算法PPT课件

    二分查找算法,二分查找算法课件,二分查找算法PPT

    java 二分查找 java 二分查找

    java 二分查找 java 二分查找java 二分查找 java 二分查找java 二分查找 java 二分查找java 二分查找 java 二分查找java 二分查找 java 二分查找java 二分查找 java 二分查找java 二分查找 java 二分查找java 二分...

    二分查找解题

    二分查找,也被称为折半查找,是一种在有序数组中高效地查找特定元素的搜索算法。这个算法的主要思想是利用数组的有序性,通过不断缩小查找范围,...通过理解并掌握二分查找,我们可以更好地应对数据处理中的各种挑战。

    深入理解二分查找(一、二分查找及其变体)

    **二分查找(Binary Search)**是一种在有序数组中寻找特定元素的搜索算法。它的基本思想是通过比较中间元素与目标值,不断缩小搜索范围,直到找到目标元素或者确定其不存在。二分查找的时间复杂度为O(log n),在大...

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

    折半查找算法,也称为二分查找算法,是一种在有序序列中快速定位特定元素的技术。由于其高效性和广泛的适用性,二分查找在计算机科学领域得到了广泛的应用,尤其在处理大数据量的有序数据时,其优势更为明显。本文将...

    二分查找最简单教程

    二分查找是一种在有序数组中查找特定元素位置的算法,它利用数组元素排序的特性,通过比较数组中间元素与目标值的大小,将查找区间缩半来加快查找速度。该算法适用于有序集合,能够将时间复杂度从线性查找的O(n)降低...

    二分查找算法流程图流程图举例

    二分查找算法是一种在有序数组中查找特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是目标值,则搜索结束;如果目标值大于或小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且...

    flash as3 二分查找动画演示

    在这个"flash as3 二分查找动画演示"项目中,我们看到的是一个用Flash AS3实现的二分查找算法的可视化教程。 二分查找(Binary Search)是计算机科学中一种高效的数据检索方法,适用于已排序的数组或列表。它的基本...

    二分查找办法

    二分查找,也被称为折半查找,是一种在有序数组中高效搜索特定元素的算法。它以其高效率和在适当数据结构中的广泛适用性而闻名。本文将深入探讨两种不同的二分查找实现:健忘版和识别版,并分析它们的效率差异。 ...

    C++ 二分查找法

    ### C++ 二分查找法详解 在计算机科学领域,数据结构与算法是核心课程之一,其中二分查找法(Binary Search)是一种高效的查找技术,尤其适用于有序数组或列表的搜索场景。本文将深入探讨C++中实现二分查找法的具体...

    查找算法集(顺序查找、二分查找、插值查找、动态查找)

    以下是四种常见的查找算法:顺序查找、二分查找、插值查找和动态查找。 顺序查找 顺序查找是一种最简单的查找算法,它的实现方式是从数组或链表的第一个元素开始,逐个比较元素直到找到目标元素或达到数组或链表的...

    二分查找 C语言源代码

    二分查找 C语言语言源代码 用递归写的 C语言入门经典代码 值得收藏

    可视化查找之二分查找

    简单地实现了二分查找的可视化。界面很简单就包括两个部分:界面左侧是可视化查找部分,右侧是二分查找的代码。 程序的关键点主要有两点: 1. 如何在页面上表示出查找程序的运行过程。 2. 如何将排序程序的运行...

    二分查找算法 VC++

    二分查找算法,也称为折半查找,是计算机科学中一种高效的搜索算法,尤其适用于已排序的数据集合。这种算法的基本思想是将数据集分为两半,每次比较中间元素与目标值,根据比较结果缩小搜索范围,直至找到目标值或者...

    二分查找算法FLASH演示

    二分查找算法,也称为折半查找,是计算机科学中一种高效的搜索算法,尤其适用于已排序的数据集合。这个算法的基本思想是通过不断缩小搜索范围,快速定位目标元素。以下是关于二分查找算法的详细说明: 一、算法原理...

    Java二分查找示例代码

    在编程领域,二分查找(Binary Search)是一种高效地在有序数组或集合中搜索特定元素的算法。这个算法充分利用了数组的线性特性,通过不断缩小搜索范围来找到目标值。下面我们将深入探讨Java实现二分查找的具体步骤...

Global site tag (gtag.js) - Google Analytics