JavaSE第三十六讲:Java数组查找方式及二分查找分析

查找数组中是否存有某一个值。

【方法一】:可以拿这个值与数组中的元素一一进行匹配,如果匹配成功,返回这个元素的数组下标。

public class ArraySearchTest{

	public static int search(int[] array, int value){
		for(int i = 0; i < array.length; i++){
			if(value == array[i]){
				return i;
			}
		}
		return -1;
	}
	public static void main(String[] args){
		int[] a = new int[]{1, 2, 3, 5, 6, 7, 8, 9};
		int value = 9;
		int index = ArraySearchTest.search(a, value);
		System.out.println(index);
	}
}
编译执行结果:

D:\src>java ArraySearchTest
7

【说明】:return -1;表示如果搜索无结果则返回-1,表示不存在这个数,这边如果返回0的话,会与返回数组下标为0重复了,所以建议返回-1。

这个数组的效率是比较低的,如果数组中有一万个元素,这样遍历数组代价是很高的建议不适用。


【方法二】:二分查找

二分查找(Binary Search):前提必须是待查找的数组要有序。要么是升序,要么是降序。 

比如以下例子:1  3  5  6  7  8  10  12  15  16  19  22 23  25  27 实现二分查找数组的是否有25,返回数组下标。

【原理】:这是一个升序的数组,先取数组中间元素与要比较的值[12]进行比较,若大则往右边所搜索的值在右边区域,否者则相反,然后再右边的数组中再去中间值[22]进行比较,如果大则往右边区域再二分,如此进行下去,知道找到值为止

【注意】:数组长度为奇偶数对比较影响,若奇取中间值,若偶数取中间两个数任意一个都可以。

以下为实现上述二分查找的实现代码:

public class ArraySearch{
	public static int arraySearch(int[] array, int value){
		int high = array.length - 1;
		int low = 0;
		int middle;
		while(low <= high){
				middle = (low + high) / 2;
				if(array[middle] == value){
					return middle;
				}
				if(value < array[middle]){
					high = middle - 1;
				}
				if(value > array[middle]){
					low = middle + 1;
				}
			}
			return -1;
		}
		
	public static void main(String[] args) {
		int[] a = new int[]{1, 2, 3, 5, 6, 7, 8, 9};  
        int value = 9;  
        int index = ArraySearch.arraySearch(a, 9);
        System.out.println(index);
		
	}
}
编译执行结果:

D:\src>java ArraySearch
7

【说明】:设计一个while循环while(low <= high){};如果数组设计的最低的下标都已经超过最高的数组下标则说明已经遍历到头了。注意其中如果待比较值比每次查找的数组中间值要小,则把middle作为数组的最高下标,这样设计就可以去掉右边比比较值大的右边的数组。


为了更直观的明白二分查找过程中数组的查找中间值的情况,添加下面代码段,可以将每次查找中间值后用#号区分。

				for(int i = 0; i < array.length; i++){
					System.out.print(array[i]); //打印每次遍历的数组
					if(i == middle){
						System.out.print("#"); //用#号区分
					}
					System.out.print(" "); //各个数组之间用空格隔开
				}
				System.out.println();//换行

小技巧】:其中System.out.print(" ");表示无换行的输出空格。System.out.println();表示换行。

完整程序如下所示:

public class ArraySearch{
	public static int arraySearch(int[] array, int value){
		int high = array.length - 1;
		int low = 0;
		int middle;
		while(low <= high){
				middle = (low + high) / 2;

				for(int i = 0; i < array.length; i++){
					System.out.print(array[i]); //打印每次遍历的数组
					if(i == middle){
						System.out.print("#"); //用#号区分
					}
					System.out.print(" "); //各个数组之间用空格隔开
				}
				System.out.println();//换行


				if(array[middle] == value){
					return middle;
				}
				if(value < array[middle]){
					high = middle - 1;
				}
				if(value > array[middle]){
					low = middle + 1;
				}
			}
			return -1;
		}
		
	public static void main(String[] args) {
		int[] a = new int[]{1, 2, 3, 5, 6, 7, 8, 9};  
        int value = 9;  
        int index = ArraySearch.arraySearch(a, 9);
        System.out.println(index);
		
	}
}
编译执行结果:

D:\src>java ArraySearch
1 2 3 5# 6 7 8 9
1 2 3 5 6 7# 8 9
1 2 3 5 6 7 8# 9
1 2 3 5 6 7 8 9#
7


你可能感兴趣的:(二分查找,数组,search,search)