【算法数据结构Java实现】折半查找

1.背景

以一个题目为例,一个整数x是一组按大小顺序排列好的数列中的一个数,我们要找到x在数列中的索引位置。

比如按从小到大排列的数列:

-3,-2,0,4,5,7,12,64

我们要找到数字7的位置,如果是线性查找,时间复杂度是O(n),如果用折半查找的话,时间复杂度是O(log(n)),因为每次折半,计算量少一半,所以取对数。

2.代码

package Algorithm_analysis;

public class Bisearch {

	static int[] array={-3,-2,0,4,5,7,12,64};
	public static void main(String args[]){
	   int left=0;
	   int right=array.length;
	   int center=0;
	   int k=7;

	   while(left<=right){
		  center=(right+left)/2;
		   if ((array[center]-k)==0){
			  System.out.print(center);
			  break;
		   }
		   else{
            if((array[center]-k)>0){
                 right=center;
            }
                 else{
                	 left=center;
                 }
                	 }
                 }
	   }
}

//输出结果7

/********************************

* 本文来自博客  “李博Garvin“

* 转载请标明出处:http://blog.csdn.net/buptgshengod

******************************************/

时间: 2024-11-10 01:13:37

【算法数据结构Java实现】折半查找的相关文章

java之折半查找

//功能:二分查找import java.util.*; public class Demo1 {    public static void main(String[] args) {      int arr[]={2,5,7,12,25};//定义arr数组并赋值      System.out.print("请输入你需要查找的数:");      Scanner sr=new Scanner(System.in);      int a=sr.nextInt();      B

Java实现折半查找(二分法)

利用Java实现折半查找 基本思路:while递归循环,不断判断a[middle]是否等于data,如果等于则跳出循环,返回索引值,如果不等,则进行二分处理,直至两者相等为止:其中通过count计数器记录查找次数,当count次数超过20次时视为元素不存在(此处有待优化) package test; /* * 二分法查找(折半查找) * TGmoving * */ public class halfSearch { public static int HalfSearch(int a[],int

数据结构Java版之查找算法(三)

关于查找算法,这里只进行两个算法的说明.包括 顺序查找 和 折半查找. 顺序查找: 顺序查找常用于未排序的数据中.查找速度较慢,只能应用于较小的数据量. public int sequentialSearch(int[] list, int ele) { for(int i = 0; i < list.length; i ++) { if(ele == list[i]) return i; } return -1; } 折半查找: 比较快的查找算法,但也仅限于对排好序的数据进行查找. publi

【算法数据结构Java实现】时间复杂度为O(n)的最大和序列

1.背景 最大序列和问题一直以来是一个比较经典的算法题,看到这个问题,有很多解题的办法.今天看到了一种时间复杂度只为O(n)的解题算法,在这里记录下. 思路很简单,比方说有P1,P2,P3,P4.....这样一个序列,我们从P1开始求和,比如说在P5时求和数小于零,就可以断定.第一种情况,最大序列在P1~P5之间,或者说在P6~Pn之间.因为如果P1+P2+......+P5的和小于零,那么它可以看成一个数,而且是序列第一个数,则任何一个最大序列都不会包含这个数. 2.代码实现 package

【算法数据结构Java实现】Java实现动态规划(背包问题)

1.背景 追随着buptwusuopu大神的脚步,最近在研习动态规划.动态规划应该叫一种解决问题的思想,记得又一次去某公司面试就被问到了这个. 多于动态规划的理解,大致是这样的,从空集合开始,每增加一个元素就求它的最优解,直到所有元素加进来,就得到了总的最优解. 比较典型的应用就是背包问题,有一个重量一定的包,有若干件物品,他们各自有不同的重量和价值,怎样背才能取得最大价值. 错误的理解:去价值/重量比最大的物品多装(之前我也是这么想的,但是在背包重量一定的情况下这么做并不合理,范例很容易想到)

【算法数据结构Java实现】递归的简单剖析及时间复杂度计算

1.理解 对于递归函数的理解,我觉得是比较重要的,因为很多大神能把递归函数用的惟妙惟肖,不光是他们的编程功力高深,更主要是能理解这个算法.比较直白的理解是,如果一个事件的逻辑可以表示成,f(x)=nf(x-1)+o(x)形式,那么就可以用递归的思路来实现. 编写递归逻辑的时候要知道如下法则: 1.要有基准 比如说,f(x)=f(x-1)+1,如果不加入基准,f(0)的值是多少,那么函数会无限执行下去,没有意义 2.不断推进 也就是f(x)=f(x-1)或是f(x)=f(x/n)之类的 当然每个递

【算法数据结构Java实现】欧几里得算法

1.背景 欧几里得算法是一个求最大因子的快速算法.如果m,n存在最大因子k,假设m=x*n+r,那么m和n可以整出k的话,r也肯定可以整除k 因为定理:如果M>N,则M mod N<M/2 ,说明时间复杂度是O(log(n)) 2.代码 package Algorithm_analysis; public class Euclid { public static void main(String[] args){ int m=63; int n=18; int remainder=0; whi

数据结构(六)查找---有序表查找(三种查找方式:折半,插值,斐波拉契查找)

前提 有序表查找要求我们的数据是有序的,是排序好的,我们只需要进行查找即可 我们下面将介绍折半查找(二分查找),插值查找,斐波那契查找 一:折半查找 (一)定义 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法.但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列. (二)查找过程 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关

java 二分查找 - 折半查找算法

二分查找: 这个算法是比较简单的,容易理解的.这个算法是对有序的数组进行查找,所以想要使用这个算法那么 首先先要对数组进行排序. 其实有三个指针,开始指针,末尾指针,中间指针,来开始.折半查找. 步骤如下: 1.确定三个指针,start,end,middleIndex. 2.判断start<=end,如果满足,就执行这个方法,不满足,就返回,找不到. 3.在2的前提下,我们对其折半查找,middleIndex = start+end >> 1,取中间值. 4.判断中间位置的值和目标值是否