二分查找又称折半查找,
优点是比较次数少,查找速度快,平均性能好;
其缺点是要求待查表为有序表,且插入删除困难。
因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
算法简介
算法要求
必须采用顺序存储结构
2.必须按关键字大小有序排列。
算法复杂度
假设其数组长度为n,其算法复杂度为o(log(n))
下面提供一段二分查找实现的伪代码:
BinarySearch(max,min,des)
mid-<(max+min)/2
while(min<=max)
mid=(min+max)/2
if mid=des then
return mid
elseif mid >des then
max=mid-1
else
min=mid+1
return max
折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用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。
二分查找法一般都存在一个临界值的BUG,即查找不到最后一个或第一个值。可以在比较到最后两个数时,再次判断到底是哪个值和查找的值相等。
2代码示例
pascal源代码
program jjzx(input,output);
var
a:array[1..10] of integer;
i,j,n,x:integer;
begin
writeln('输入10个从小到大的数:');
for i:=1 to 10 do read(a[i]);
writeln('输入要查找的数:');
readln(x);
i:=1; n:=10; j:=trunc((i+n)/2);
repeat
if a[j]>x then
begin
n:=j-1; j:=trunc((i+n)/2)
end
else if a[j]<x then
begin
i:=j+1; j:=trunc((j+n)/2)
end;
until (a[j]=x) or (i>=n) ;{为什么是这个结束循环条件}
if a[j]=x then
writeln('查找成功!位置是:',j:3)
else
writeln('查找失败,数组中无此元素!')
end.
C语言代码
int BinSearch(SeqList * R, int n , KeyType K )
{
//在有序表R[0..n-1]中进行二分查找,成功时返回结点的位置,失败时返回-1
int low=0,high=n-1,mid; //置当前查找区间上、下界的初值
if(R[low].key==K)
{
return low ;
}
if(R[high].key==k)
return high;
while(low<=high)
{
//当前查找区间R[low..high]非空
mid=low+((high-low)/2);//使用 (low + high) / 2 会有整数溢出的问题(问题会出现在当low + high的结果大于表达式结果类型所能表示的最大值时,这样,产生溢出后再/2是不会产生正确结果的,而low+((high-low)/2)不存在这个问题
if(R[mid].key==K)
{
return mid; //查找成功返回
}
if(R[mid].key>K)
high=mid-1; //继续在R[low..mid-1]中查找
else
low=mid+1; //继续在R[mid+1..high]中查找
}
if(low>high)
return -1; //当low>high时表示查找区间为空,查找失败
} //BinSeareh
Java代码
public class BinarySearch {
/**
* 二分查找算法
*
* @param srcArray 有序数组
* @param des 查找元素
* @return des的数组下标,没找到返回-1
*/
public static int binarySearch(int[] srcArray, int des)
{
int low = 0;
int high = srcArray.length-1;
while(low <= high)
{
int middle = (low + high)/2;
if(des == srcArray[middle])
{
return middle;
}
else if(des <srcArray[middle])
{
high = middle - 1;
}
else
{
low = middle + 1;
}
}
return -1;
}
public static void main(String[] args)
{
int[] src = new int[] {1, 3, 5, 7, 8, 9};
System.out.println(binarySearch(src, 3));
}
}
AAuto代码
//二分查找
function binSearch(t,v ){
var p = #t;
var p2;
var b = 0;
do{
p2 = p;
p = b + math.floor( (p-b) / 2 ) //二分折半运算
if(p==b)return;
if( t[p] < v ){ //判断下限
b = p;
p = p2;
}
}while( t[p]>v ) //判断上限
return t[p]==v && p;
}
//测试
tab = {}
//创建数组,每个元素都是随机数
for(i=1;10 ;1){
tab[i] = math.random(1, 10000)
}
//插入一个已知数
table.push(tab,5632)
//排序
table.sort( tab)
io.open()
io.print( "数组",table.tostring(tab) )
io.print( "使用二分查找,找到5632在位置:",binSearch( tab,5632 ) )
PHP代码
// 递归版本
function bin_sch($array, $low, $high, $k){
if ($low <= $high){
$mid = intval(($low+$high)/2);
if ($array[$mid] == $k){
return $mid;
}elseif ($k < $array[$mid]){
return bin_sch($array, $low, $mid-1, $k);
}else{
return bin_sch($array, $mid+1, $high, $k);
}
}
return -1;
}
// 非递归版本
function binsearch($x, $a)
{
$c = count($a);
$lower = 0;
$high = $c - 1;
while ($lower <= $high)
{
$middle = intval(($lower + $high) / 2);
if ($a[$middle] > $x)
$high = $middle - 1;
else if ($a[$middle] < $x)
$lower = $middle + 1;
else
return $middle;
}
return -1;
}
C++代码
int binSearch(const int *Array,int start,int end,int key)
{
int left,right;
int mid;
left=start;
right=end;
while (left<=right) { /注释中为递归算法,执行效率低,不推荐
mid=(left+right)/2;
/* if (key<Array[mid]) {
return(binSearch(Array,left,mid,key));
}
else if(key>Array[mid]){
return (binSearch(Array,mid+1,right,key));
}
else
return mid;
*/
if (key<Array[mid]) {
right=mid-1;
}
else if(key>Array[mid]){
left=mid+1;
}
else
return mid;
}
return -1;
}
AS3代码
public static function binSearch(list:Array, low:int, high:int,key:int):int
{
if (low > high) return -1;
var mid:int = low + int((high - low) / 2);
var index:int =-1
if (list[mid] == key)
{
index=mid;
}
else if (list[mid] < key)
{
low = mid + 1;
index=binSearch(list, low, high, key);
}
else
{
high = mid - 1;
index=binSearch(list, low, high, key);
}
return index;
}
JS 代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var Arr = [3,5,6,7,9,12,15];
function binary(find,arr,low,high){
if(low <= high){
if(arr[low] == find)
return low;
if(arr[high] == find)
return high;
var mid = Math.ceil((high + low)/2);
if(arr[mid] == find){
return mid;
}else if(arr[mid] > find){
return binary(find,arr,low,mid-1);
}else{
return binary(find,arr,mid+1,high);
}
}
return -1;
}
binary(15,Arr,0,Arr.length-1);
分享到:
相关推荐
二分查找算法是一种在有序数组中寻找特定元素的搜索算法,其效率远高于线性查找。这个算法基于分治策略,将查找范围不断减半,直到找到目标元素或者确定目标不存在。Java 中实现二分查找的基本步骤如下: 1. 首先,...
在计算机科学中,大整数算法和二分搜索算法是两个重要的编程概念,尤其是在处理大量数据和优化搜索效率时显得尤为关键。 大整数算法主要应用于处理超过标准数据类型(如int、long)能表示的最大整数值。在Java中,`...
### Java二分查找算法知识点详解 #### 一、二分查找算法概述 二分查找算法是一种在有序数组中查找特定元素的搜索算法。其工作原理是通过将目标值与数组中间元素进行比较来缩小搜索范围,进而达到快速查找的目的。...
在给出的Java代码中,`binarySearch`方法实现了二分搜索算法。它接收一个整数数组`a[]`、目标值`x`和数组长度`n`作为参数。在`while`循环中,每次都将搜索区间从`[left, right]`缩小至`[left, middle - 1]`或`...
Java二分查找递归算法
二分查找:分别使用Java和Python实现二分查找算法 二分查找:分别使用Java和Python实现二分查找算法 二分查找:分别使用Java和Python实现二分查找算法 二分查找:分别使用Java和Python实现二分查找算法 二分查找:...
二分搜索算法是高效的搜索算法,用于在有序数组中查找特定元素的位置,通过不断缩小搜索范围来提高效率。下面是二分搜索算法的详细知识点: 概念:二分搜索算法(Binary Search)是一种高效的搜索算法,用于在有序...
本文将详细解析标题“java二分搜索法程序,分行显示”所涉及的Java编程技术,包括二分搜索法的原理、实现以及如何结合数据结构进行文字处理。 首先,我们来了解**二分搜索法**(Binary Search)。它是一种在有序...
二分搜索算法是一种高效、...这个压缩包中的"二分算法"可能是包含了实现二分搜索算法的源代码文件,可能还包括了测试用例和相关文档。通过阅读和理解这些文件,你可以更深入地了解如何在实际项目中运用二分搜索算法。
Java中的二分搜索算法是一种高效的查找方法,尤其适用于已排序的数组。在本文中,我们将深入探讨二分搜索算法的概念,以及如何在Java中实现它。这个特定的Java程序展示了如何在一个长整型数组中使用递归二分搜索算法...
本篇文章将深入探讨在Java中实现的几种常见的搜索算法,包括二分搜索和线性搜索,这些都是数据结构和算法学习的重要部分。 首先,我们来理解这两种搜索算法的基本概念: 1. **线性搜索**(Linear Search):这是最...
二分搜索算法,也称为折半搜索或二分查找,是一种在有序数组中查找特定元素的搜索算法。这种算法的基本思想是通过不断将搜索区间减半来快速定位目标值,从而显著提高了查找效率。二分搜索算法充分利用了数据的有序性...
设a[0:n-1]是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置I和大于x的最大元素位置j
在Java中,我们有排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序)、搜索算法(如线性搜索、二分搜索)、图算法(如深度优先搜索、广度优先搜索)以及动态规划、贪心算法等。这些算法在不同...
2. **搜索算法**:如线性搜索、二分搜索、广度优先搜索(BFS)、深度优先搜索(DFS)等,用于查找特定元素。 3. **动态规划**:适用于可以分解为子问题的优化问题。 4. **贪心算法**:在每一步都做出局部最优选择,...
Java 二分查找是搜索有序数组中某个元素的最常用算法之一。它的实现原理是将数组分成两个部分,然后在其中一个部分继续进行搜索,直到找到目标元素或确定目标元素不存在。下面将详细介绍 Java 二分查找的实现技术。 ...
二分查找,也称为折半查找,是一种在有序数组中高效搜索特定元素的算法。它的基本思想是利用数组的有序性,通过每次比较中间元素来不断缩小搜索范围。相比于线性查找,二分查找的时间复杂度显著降低,达到了O(log n)...
Java分治法与二分搜索算法实例分析 ...本文实例讲述了Java分治法与二分搜索算法,简单讲述了分治法与二分搜索算法的原理并结合java实例分析了二分搜索算法的实现与使用技巧,需要的朋友可以参考下。
4. **排序与查找**:包括经典的排序算法(冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等)和查找算法(线性查找、二分查找)。这些是任何程序员都应该掌握的基础知识。 5. **树结构**:书中会详细...
2. 二分搜索:适用于已排序的列表,每次比较中间元素,缩小搜索范围。 3. 深度优先搜索(DFS):用于图或树的遍历,沿着一条路径深入,直到达到目标或回溯。 4. 广度优先搜索(BFS):按层遍历图或树,先访问离起点...