码迷,mamicode.com
首页 > 其他好文 > 详细

二分查找算法

时间:2014-06-08 18:07:41      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:c   style   class   blog   code   java   

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功

算法要求:

1.必须采用顺序存储结构

.2.必须按关键字大小有序排列。

下面是c++与java的不同实现:

已经假设所查询数组均为升序排列好了:

c++版:

#include <iostream>
#include <stdlib.h>
#define  ERROR -1
#define LEN 10
using namespace std;
/************************************************************************/
/*  T		自定义数据类型 
	value	查找的值
	low		左侧边界 (一般为0)
	high    右侧边界(一般为数组长度-1)
/************************************************************************/
template <class T>
int binarySearch(T table[],T value,int low,int hign){
	if(low<=hign){//边界有效
		int mid = (low+hign)/2; //找到中间点
		if(table[mid]==value){//如果中间点的值就是我们查找的值,则返回该点
			return mid;
		}else if(table[mid]>value){//如果中间值比查找值大,则证明查找的值在中间点的左侧
			return binarySearch(table,value,low,mid-1);//继续将范围缩小到原来一半(靠左缩小)
		}else{
			return binarySearch(table,value,mid+1,hign);//继续将范围缩小到原来一半(靠右缩小)
		}
	}
	return ERROR;
}
/************************************************************************/
/* 由上述代码可以知道,上边界和和下边界其实就是数组的开始和结束位置,因此上述函数可以泛化为下列函数                                                                     */
/************************************************************************/
template <class T>
int binarySearch(T table[],int n,T value){
	return binarySearch(table,value,0,n-1);
}
template <class T>
void print(T table[],int n){
	for (int i=0;i<n;i++)
	{
		cout<<table[i]<<" ";
	}
	cout<<"\n";
}
int main(void){

	//给出一个已经排序好的数组
	int array[LEN] = {0};
	for (int i=0;i<LEN;i++)
	{
		array[i] = i+10;
	}
	cout<<"您要查找的序列为:";
	print(array,LEN);
	cout<<"请输入你要查找的内容:";
	int search;
	cin>>search;
	//调用函数
	int searchResult = binarySearch(array,LEN,search);
	cout<<"查找内容为"<<search<<"在指定数组的第"<<(searchResult+1)<<"处"<<endl;
	system("pause");
	return 1;
}
java版:

package cn.demo;

import java.util.Scanner;

public class BinarySearch {
	static final int LEN = 10;
	static int binarySearch(int [] table,int value,int low,int high){
		int error = 0;
			if(low<=high){
				int mid = (low+high)/2; //找到中间点
				if(table[mid]==value){//如果中间点的值就是我们查找的值,则返回该点
					return mid;
				}else if(table[mid]>value){//如果中间值比查找值大,则证明查找的值在中间点的左侧
					return binarySearch(table,value,low,mid-1);//继续将范围缩小到原来一半(靠左缩小)
				}else{
					return binarySearch(table,value,mid+1,high);//继续将范围缩小到原来一半(靠右缩小)
				}
			}
			return error;
		}
	static int binarySearch(int [] table,int n,int value){
		return binarySearch(table,value,0,n-1);
	}
	static void print(int table[],int n){
		for (int i=0;i<n;i++)
		{
			System.out.print(table[i]+" ");
		}
		System.out.println();
	}
	public static void main(String[] args) {
		int array[] = new int[LEN];
		for (int i = 0; i < array.length; i++) {
			array[i] = i+10;
		}
		print(array,LEN);
		Scanner in = new Scanner(System.in);
		System.out.print("请输入您要查找的内容:");
		int search = in.nextInt();
		int result = binarySearch(array,LEN,search);
		System.out.println("您要查找的"+search+"在指定数组的第"+(result+1)+"处");
	}
}



二分查找算法,布布扣,bubuko.com

二分查找算法

标签:c   style   class   blog   code   java   

原文地址:http://blog.csdn.net/u012332735/article/details/28770431

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!