【算法】算法-二分搜索

实现

package BinarySearch;

public class BinarySearch {

	/**
	 * 二分查找递归算法
	 * @param a
	 * @param m 查找数
	 * @param left 起始下标
	 * @param right 终止下标
	 * @return 查找到的数组下标+1,即是数组中的第几个数
	 */
	public static int BinarySearch1(int[] a,int m,int left,int right){
		int message = -1;
	    int mid;
	    int r;
	    mid=(left+right)/2;
	    if(m == a[mid]){
	    	//中间的数正好是查找的数
	    	message = mid+1;
	    }else if(right >= left){
			if(a[mid] > m){
				r=BinarySearch1(a,m,left,mid-1);
			}else{
				r=BinarySearch1(a,m,mid+1,right);
			}
			message = r;
		}else if(left>right){
			message = -1;
	    }
		return message;
	}
	/**
	 * 二分查找非递归算法
	 * @param a 数组
	 * @param x 要查找的数
	 * @param n 数组大小
	 * 算法复杂度:最坏情况:O(logn)
	 * @return
	 */
	public static int BinarySearch2(int[] a, int x, int n){
		int message = -1;//未找到x

	    int left = 0;
	    int right = n-1;
	    int mid;
	    while( left <= right )
	    {
	        mid = ( left + right ) / 2;
	        if( x == a[mid] ){

	        	message = mid+1;
	        	break;
	        }
	        if( x > a[mid] )
	            left = mid + 1;
	        else
	            right = mid - 1;
	    }
		return message;
	}
}

package BinarySearch;

import java.util.Scanner;

public class Main{
	
	private static int MAX_SIZE = 10;
	
	public static void main(String[] args){

	    int a[] = new int[MAX_SIZE];
	    
		System.out.println("请输入您要查找的序列个数:");
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		
		System.out.println("请输入升序排列的数列:  "); 
		for(int i=0; i<n; i++){
			a[i] = in.nextInt();
	    }
		
		System.out.println("请输入需要查找的数:  ");
		int x = in.nextInt();		

	    int r1 = BinarySearch.BinarySearch1(a,x,0,n-1);
	    int r2 = BinarySearch.BinarySearch2(a,x,n);

	    if(-1 == r1){
			System.out.println("BinarySearch1:您查找的数不存在!!!");
	    }else{
			System.out.println("BinarySearch1:您查找的数是该序列的第" + r1 + "个数");
	    }
	    if(-1 == r2){
			System.out.println("BinarySearch2:您查找的数不存在!!!");
	    }else{
			System.out.println("BinarySearch2:您查找的数是该序列的第" + r2 + "个数");
	    }
	}
}

复杂度分析

T(n)=1 (n=1)
T(n)=T(n/2) + O(1) (n>=2)
最坏情况:O(logn)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值