【数据结构与算法】二分查找

  • 基本思想

首先将给定的值K与表中中间位置元素比较,若相等,则查找成功;若不等,则所需查找的元素只能在中间数据以外的前半部分或者后半部分,缩小范围后继续进行同样的查找,如此反复,直到找到为止。

  • 代码实现

/**
 * 源码名称:BinarySearch.java
 * 日期:2014-08-14
 * 程序功能:二分查找
 * 版权:[email protected]
 * 作者:A2BGeek
 */
public class BinarySearch {
	public static int binarySearch(int[] in, int key) {
		int start = 0;
		int end = in.length - 1;
		int index = -1;
		while (start <= end) {
			// int mid = (start + end) / 2;会溢出
			// int mid = start + (end - start) / 2;
			int mid = start + ((end - start) >> 2);
			// int mid = (start + end) >>> 1;
			if (key < in[mid]) {
				end = mid - 1;
			} else if (key > in[mid]) {
				start = mid + 1;
			} else {
				index = mid;
				break;
			}
		}
		return index;
	}

	public static int binarySearchRecursive(int[] in, int key, int start,
			int end) {
		if (start <= end) {
			int mid = start + ((end - start) >> 2);
			if (key < in[mid]) {
				end = mid - 1;
				return binarySearchRecursive(in, key, start, end);
			} else if (key > in[mid]) {
				start = mid + 1;
				return binarySearchRecursive(in, key, start, end);
			} else {
				return mid;
			}
		} else {
			return -1;
		}
	}

	public static void main(String[] args) {
		int[] testCase = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 20, 36 };
		System.out.println(binarySearch(testCase, 12));
		System.out.println(binarySearchRecursive(testCase, 12, 0,
				testCase.length - 1));
	}
}

【数据结构与算法】二分查找

时间: 2024-10-18 12:50:16

【数据结构与算法】二分查找的相关文章

数据结构和算法————二分查找

  二分查找 这些天深刻的体会到了巩固知识的重要性.对数据结构和算法的学习有一年的时间,然后搁置了一年,最后发现都忘记了. 不过还好不是失忆,看了之前做过的笔记,还是能回想起来的. 现在想在写一遍,算是对本子上的笔记做一个备份,更重要的是加深我的印象. 首先说一下二分查找的思想:假设数据是按升序排序的,对于给定值val,从序列的中间位置开始比较. 如果当前位置值等于val,则查找成功: 若val小于当前位置值,则在数列的前半段中查找 若val大于当前位置值,则在数列的后半段中继续查找. 重复以上

[数据结构与算法] : 二分查找

1 #include <stdio.h> 2 3 #define NotFound -1; 4 typedef int ElementType; 5 6 int BinarySearch( const ElementType A[], ElementType X, int N ) 7 { 8 int Low, Mid, High; 9 10 Low = 0; High = N-1; 11 while( Low <= High ) // 注意终止条件 12 { 13 Mid = (Low

查找算法-二分查找

查找算法-二分查找 标题 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法.但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列. 过程 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找

数据结构与算法14—查找

查找 基本概念 查找就是在数据集中找出一个“特定元素”. 查找表是由同一类型的数据元素(或记录)构成的集合. 查找表是一种以集合为逻辑结构.以查找为核心的数据结构. 关键字 有时候我们需要指定某数据项的值来查找,这就用到了关键字. 关键字是数据元素中某个数据项的值,用以标识一个数据元素. 若此关键字可以识别唯一的一个记录,则称之谓“主关键字”:若此关键字能识别若干记录,则称之谓“次关键字”. 例: 对查找表经常进行的操作: 1)查询某个“特定的”数据元素是否在查找表中: 2)检索某个“特定的”数

[经典算法] 二分查找

题目说明: 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回对应的数组下标,失败返回-1. 题目解析: 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表. 二分查找可以解决(预排序数组的查找)问题:只要数组中包含T(即要查找的值),那么通过不断缩小包含T的范围,最终就可以找到它.其算法流程如下: 1.一开始,范围覆盖整个数组. 2

检索算法——二分查找

如果要查找的数据是有序的, 二分查找算法比顺序查找算法更高效. function insertionSort(arr) { var temp, inner; for ( var outer = 1; outer < arr.length; ++outer) { temp = arr[outer]; //选中一个值作为临时值,使得其前面的数依次与它进行比较 inner = outer; while (inner > 0 && (arr[inner - 1] >= temp)

算法----二分查找算法

二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为: 1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找, 2.寻找{6, 7, 8, 9}的中位数,为7,7>6,则6应该在7

莫对算法/二分查找 FZU 2072 Count

题目传送门 1 /* 2 题意:问区间内x的出现的次数 3 莫队算法:用一个cnt记录x的次数就可以了 4 还有二分查找的方法 5 */ 6 #include <cstdio> 7 #include <algorithm> 8 #include <cmath> 9 #include <cstring> 10 using namespace std; 11 12 const int MAXN = 1e5 + 10; 13 const int INF = 0x3

八大排序算法二分查找

import java.util.ArrayList;import java.util.Arrays;import java.util.List; import org.junit.Test; public class InsertSort { public static void display(int[] arr){ System.out.print("["); for(int i=0;i<arr.length;i++){ if(i == arr.length-1){ Sys

算法-二分查找

二分查找算法是在有序数组中用到的较为频繁的一种算法,同样是一种很高效的算法,我们最长遇到的判断一个数字是不是在数组中,前提是数组是有效的,通常我们会数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{0,1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素3,用二分查找的算法执行的话,其顺序为:    1.第一步查找中间元素,即4,由于4>3,则3必然在4之前的数组元素中,那么就在{0,1, 2, 3}中查找,    2.寻