二分查找

        二分查找,也稱折半查找、二分搜索,是一種在有序數組中查找某一特定元素的搜索算法。搜素過程從數組的中間元素開始,若是中間元素正好是要查找的元素,則搜素過程結束;若是某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,並且跟開始同樣從中間元素開始比較。若是在某一步驟數組已經爲空,則表示找不到指定的元素。這種搜索算法每一次比較都使搜索範圍縮小一半,其時間複雜度是O(logN)。java

package com.query.half.utils;

import java.util.Comparator;

/**
 * 二分查找  工具類
 * @author huang
 *
 */
public class HalfQueryUtil {

	private HalfQueryUtil() {
		super();
	}

	public static <T> int binarySearch(T[] list, T key, Comparator<T> comparator) {
		if(null == list || null == comparator) {
			return -1;
		}
		int retIndex = -1;
		int start = 0;
		int end = list.length;
		int middle = 0;
		int compareResult = 0;
		while(start < (end-1)) {
			middle = (start + end) >>> 1;
			compareResult = comparator.compare(list[middle], key);
			if(compareResult > 0) {
//				start = start;
				end = middle;
			} else if(compareResult < 0) {
				start = middle;
//				end = end;
			} else {
				retIndex = middle;
				break;
			}
		}
		return retIndex;
	}
	
	public static <T extends Comparable<T>> int binarySearch(T[] list, T key, int start, int end) {
		if(start <= end) {
			int middle = (start + end) >>> 1;
			int compareResult = key.compareTo(list[middle]);
			if(compareResult > 0) {
				start = middle + 1;
//				end = end;
				return binarySearch(list, key, start, end-1);
			} else if(compareResult < 0) {
//				start = start;
				end = middle - 1;
				return binarySearch(list, key, start, end-1);
			} else {
				return middle;
			}
		}
		return -1;
	}	
}

注:須要注意的是計算中間位置時不該該使用(high+ low) / 2的方式,由於加法運算可能致使整數越界,這裏應該使用如下三種方式之一:算法

end + (start – end) / 2

數組

end + (start – end) >> 1

工具

(end + start) >>> 1
相關文章
相關標籤/搜索