折半查找,binarySearch
折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用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。
二分查找有个缺点就是元数据必须是有序的,因此二分查找之前必须对对数组排序,可以根据需要选择适当的排序算法这里选择的快速排序算法。
- 首先设定三个变量,lownum,midnum,hignum 假定有十个元素则lownum = 0,hignum=9,midnum=(lownum+highnum)/2.key为查找数据。
- 如果a[midnum] = key,表示查找到数据,返回midnum
- 如果key<a[midnum]则midnum = midnum-1,递归查找a[0] ~ a[midnum-1]
- 如果key>a[midnum]则midnum = midnum+1,递归查找a[midnum+1] ~a[highnum].
下面看一下java的代码实现
package neuq.chao;
import java.util.Scanner;
class QuickSort{
static void quickSort(int []a,int left,int right){
int ltemp,rtemp,base;
ltemp = left;
rtemp = right;
int t;
base = a[(right+left)/2]; //选取中间元素作为边界
while(ltemp<rtemp){
while(a[ltemp]<base){
++ltemp; //ltemp向右移
}
while(a[rtemp]>base){
--rtemp; //rtemp向左移
}
if(ltemp<=rtemp){
t = a[ltemp];
a[ltemp] = a[rtemp];
a[rtemp] = t;
++ltemp;
--rtemp;
}
}
if(ltemp==rtemp){
ltemp++;
}
if(left<rtemp){
quickSort(a,left,ltemp-1);
}
if(ltemp<right){
quickSort(a,rtemp+1,right);
}
}
} public class BinarySearch { //折半查找
static final int SIZE = 10;
static Scanner input = new Scanner(System.in);
static int binarySearch(int []a,int left,int right,int key){
int lownum,midnum,hignum;
lownum = left;
midnum = (left+right);
hignum = right;
int i =-1;
if(key==a[midnum]){
i = midnum;
}
if(key<a[midnum]){
i = binarySearch(a,lownum,midnum-1,key);
}
if(key>a[midnum]){
i = binarySearch(a,midnum+1,hignum,key);
}
return i;
}
public static void main(String args[]){
int shuzu[] = new int[SIZE];
int h,j,i,n;
for(h=0;h<SIZE;h++){
shuzu[h] = (int)(100+Math.random()*(100+1));
}
// QuickSort qs = new QuickSort();
QuickSort.quickSort(shuzu,0,SIZE-1);
System.out.print("数组的数据为: \n");
for(i=0;i<SIZE-1;i++){
System.out.print(shuzu[i]+" ");
}
System.out.print("\n");
System.out.print("请输入查找的数据: \n");
n = input.nextInt();
j = binarySearch(shuzu,0,SIZE-1,n);
if(j<0){
System.out.print("未查找到数据");
}
else{
System.out.print(n+"是数组中第"+j+"个数");
}
}
}
折半查找,binarySearch的更多相关文章
- 二分查找BinarySearch(Java)
二分查找(折半查找)BinarySearch 二分查找 一组排好顺序的数,查找其中的一个数(value)的位置,按照数组(int[] a)存放这组数据,数组的索引所指的位置就是需要查找的数,用三个变 ...
- [转]编程珠玑第五章二分搜索(折半查找)之java实现
http://blog.csdn.net/hwe_xc/article/details/51813080 二分搜索又称为折半查找,用来高效快速的解决如下问题: 我们需要确定排序后的数组x[0..n-1 ...
- Java实现冒泡排序、折半查找
1.冒泡排序 public class BubbleSort{ public static void main(String[] args){ int score[] = {67, 69, 75, 8 ...
- java基础-数组的折半查找原理
java基础-数组的折半查找原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果让你写一个数组的查找功能,需求如下:在一个数组中,找一个元素,是否存在于数组中, 如果存在就返回 ...
- C++实现顺序查找,折半查找,插值查找
1.顺序查找 从数组起始扫描到数组结尾,判断该索引数组是否和关键字相等,成功返回1 代码如下: //顺序查找 int seqSearch(int *array, int low, int high, ...
- 算法笔记_026:折半查找(Java)
目录 1 问题描述 2 解决方案 2.1 递归法 2.2 迭代法 1 问题描述 首先,了解一下何为折半查找?此处,借用<算法设计与分析基础>第三版上一段文字介绍: 2 解决方案 2.1 递 ...
- Java实现三种常用的查找算法(顺序查查找,折半查找,二叉排序树查找)
public class Search { public class BiTreeNode{ int m_nValue; BiTreeNode m_pLeft; BiTreeNode m_pRight ...
- 折半查找——Java实现
一.查找思想 折半查找 也称为二分查找,是一种效率较高的查找方法,查找时要求表中的节点按关键字的大小排序,并且要求线性表顺序存储. 首先用要查找的关键字值(key)与中间位置结点的关键字值(arr[m ...
- Java学习笔记day07_琐碎知识_水仙花数_ASCII码_冒泡排序_简单选择排序_折半查找
琐碎知识: 水仙花数, ASCII码, 冒泡排序, 简单选择排序, 折半查找 1.水仙花数 每位数的平方的和等于本身. 如100到999之间的水仙花数满足: 个位的平方+十位的平方+百位的平方 = 本 ...
随机推荐
- UVA-11584:Partitioning by Palindromes(基础DP)
今天带来一个简单的线性结构上的DP,与上次的照明系统(UVA11400)是同一种类型题,便于大家类比.总结.理解,但难度上降低了. We say a sequence of characters is ...
- 模拟ssh、黏包、hashlib模块(MD5)
待补充..... 一.模拟ssh 二.黏包 1.黏包现象 让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd) res=subprocess.Popen(cm ...
- 【aspnetcore】在过滤器(Filter)中使用注入服务(ServiceFilter|TypeFilter)
在MVC中,AOP是很常用的功能,我们经常会使用如 ActionFilter,IAuthorizeFilter 等描述对Controller和Action进行约束和扩展,一般做法如下: public ...
- Java编程基础-变量
1.变量的定义. 变量与常量相对应,变量是在程序运行过程中它的值允许改变的量,变量可以通过变量名访问. 2.Java中的三大变量 (1).类变量.又称为静态变量,在类中定义类的属性时,使用static ...
- 面向对象super内置函数(转)
super函数用来解决钻石继承. 一.python的继承以及调用父类成员 父类: class Base(object): def __init__(self): print("base in ...
- nagios的一些东西
make install 用来安装nagios的主程序,cgi和html文件 make install-init 在/etc/rc.d/init.d目录下创建nagios启动脚本 make insta ...
- web前端性能优化 (share)
本文转自:http://www.cnblogs.com/50614090/archive/2011/08/19/2145620.html 一. WEB前台的优化规则 一.尽量减少 HTTP 请求 有几 ...
- vijos 1448 校门外的树 (不是05年普及组那题)
描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:K=1,K=1,读入l.r表 ...
- 洛谷 P1629 邮递员送信
题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要一定的时间.这个邮递员每 ...
- codevs 4165 高精度求阶乘
时间限制: 1 s 空间限制: 256000 KB 题目等级 : 白银 Silver 题目描述 Description 用高精度计算出S=n! 其中"!"表示阶乘,例如:5!= ...