递归和分治策略之二分搜索法

二分搜索法算法算是分治策略的一个典型的例子。

给定已排好序的n个元素a[0:n-1],先要在这n个元素中找出特定的一个元素x。

二分法的思想就是将n个元素分成个数大致相等的两半,根据a[n/2]与x值大小的对比,来判断下次查找的半个部分。

算法描述如下:

template<class Type>
int BinarySearch(Type a[],const Type& x,int n)
{
	int left=0;int right=n-1;
	while(left<=right){
		int middle=(left+right)/2;
		if(x==a[middle]) return middle;
		if(x>a[middle]) left=middle+1;
		else right=middle-1;
	}
	return -1;
}

其Java代码的实现如下:

package com.zly.base;

import java.util.Scanner;

/**
 * 二分搜索法
 * @author Administrator
 *
 */
public class Dichotomy {
	/**
	 * 查询数字位置
	 * @param a 数组
	 * @param x 查询的数字
	 * @param low 开始位置
	 * @param height 结束位置
	 */
	public static void getNumber(int[] a,int x,int low,int height) {
		if(low==height){
			System.out.println("不存在数字"+x);
			return;
		}
		int count=(low+height)/2;
		if(a[count]==x){
			System.out.println("你要查找的数字"+x+"在第"+(count+1)+"位");
			return;
		}
		if(a[count]>x){
			height=count-1;
		}
		if(a[count]<x){
			low=count+1;
		}
		getNumber(a, x, low, height);
	}
	
	public static void main(String[] args) {
		Scanner sr=new Scanner(System.in);
		System.out.println("请输入你要输入数字的个数:");
		int count_=sr.nextInt();
		int[] number=new int[count_];
		for(int i=0;i<count_;i++){
			System.out.println("请输入第"+(i+1)+"个数字:");
			number[i]=sr.nextInt();
		}
		System.out.println("请输入你要查询的数字:");
		int x=sr.nextInt();
		getNumber(number, x, 0, number.length);
	}
}

当然,为了避免用户输入的时候没有达到“已排序”的目的,可以在用户输入完成后,对用户的让输入结果进行排序。

    原文作者:递归与分治算法
    原文地址: https://blog.csdn.net/zly412934578/article/details/78004628
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞