Java实现二分查找算法(元素可重复)

一、什么是二分查找?

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

算法要求:1、必须采用顺序存储结构;2、必须按关键字大小有序排列。

时间复杂度:O(h)=O(log2n)

二、二分查找的Java实现

public class BinarySearch {
	public static void main(String[] args) {
		int[] arrays = new int[]{1,2,3,4,6,6,7,7,8,9,10};
		int target = 7;
		System.out.println(search(arrays, target, 0, arrays.length));
	}	

	public static String search(int[] arrays, int target, int head, int tail) {
		int center = (head + tail) / 2;
		if (center < 0 || center > arrays.length - 1) {
			return "No result.";
		}
		if (target == arrays[center]) {
			String rst = "Result location = " + (center + 1);// 结果1

			// BEGIN-结果1前后是否有相等的结果
			int index = center;
			do {
				if(target == arrays[--index]) {
					rst += ", " + (index + 1);
				} else {
					break;
				}
			} while(index >= head);
			do {
				if(target == arrays[++center]) {
					rst += ", " + (center + 1);
				} else {
					break;
				}
			} while(center <= tail);
			// END-结果1前后是否有相等的结果

			return rst;
		} else if (target < arrays[center]) {
			return search(arrays, target, head, center - 1);
		} else if (target > arrays[center]) {
			return search(arrays, target, center + 1, tail);
		} else {
			return "No result.";
		}
	}
}

说明:上面代码有10几行在处理一种特殊情况,就是当有重复元素存在时,找到第一个结果后,需要在结果的前后继续找一下,这个可以根据具体题目要求来作答,如果数组中没有重复元素,那就可以直接忽略这一步了。

点赞