二分查找算法

package com.zengms.suanfa.search;

/**
 * 二分查找算法 1、前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序
 * 2、原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后;
 * 将要查找的值和数组的中值进行比较,若小于中值则在中值前面找,若大于中值则在中值后面找,等于中值时直接返回。然后依次是一个递归过程,
 * 将前半部分或者后半部分继续分解为三部分。可能描述得不是很清楚,若是不理解可以去网上找。从描述上就可以看出这个算法适合用递归来实现,
 * 可以用递归的都可以用循环来实现。所以我们的实现分为递归和循环两种,可以根据代码来理解算法
 */

public class BinarySearch {

	/**
	 * 通过递归方法实现二分查找
	 * 
	 * @param array
	 * @param key
	 * @return
	 */
	public static int binarySearch1(int array[], int key, int low, int high) {

		int middle = 0;

		if (low > high)
			return -1;
		middle = (low + high) / 2;

		if (array[middle] == key) {
			return middle;
		} else if (array[middle] < key) {
			return binarySearch1(array, key, middle + 1, high);
		} else {
			return binarySearch1(array, key, low, middle - 1);
		}
	}

	/**
	 * 通过循环实现二分查找
	 * 
	 * @param array
	 * @param key
	 * @return
	 */
	public static int binarySearch2(int array[], int key) {
		int low = 0;
		int high = array.length - 1;
		while (low <= high) {
			int middle = low + ((high - low) >> 1);
			if (key == array[middle]) {
				return middle;
			} else if (key < array[middle]) {
				high = middle - 1;
			} else {
				low = middle + 1;
			}
		}
		return -1;
	}

	
	/**
	 * 顺序查找:顺序查找适合于存储结构为顺序存储或链接存储的线性表。
	 * 查找一般是针对已排序的列表进行查找
	 * 
	 * @param array
	 * @param Key
	 * @param n
	 * @return
	 */
	public int SequelSearch(int array[], int key)
	/* 在s[0]-array[n-1]中顺序查找关键字为Key的记录 */
	/* 查找成功时返回该记录的下标序号;失败时返回-1 */
	{
		int index = -1;
		int len = array.length;
		for (int i = 0; i < len; i++) {
			if (array[i] == key) {
				index = i;
				break;
			}
		}
		return index;
	}
	
	public static void main(String[] args) {

		int array[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
		int key = 1;
		int low = 0;
		int high = 7;
		int index = -1;

		index = BinarySearch.binarySearch1(array, key, low, high);
		System.out.println("binarySearch1 array[" + index + "] =" + index);
		index = BinarySearch.binarySearch2(array, key);
		System.out.println("binarySearch2 array["+index+"] ="+index);

	}
}

你可能感兴趣的:(二分查找算法)