Java SE 036 Java数组查找方式及二分查找剖析

(1)一个人只要自己不放弃自己,整个世界也不会放弃你.
(2)天生我才必有大用
(3)不能忍受学习之苦就一定要忍受生活之苦,这是多么痛苦而深刻的领悟.
(4)做难事必有所得
(5)精神乃真正的刀锋
(6)战胜对手有两次,第一次在内心中.
(7)编写实属不易,若喜欢或者对你有帮助记得点赞+关注或者收藏哦~

Java SE 036 Java数组查找方式及二分查找剖析

1.数组查找

public class ArraySearchTest{
    
    
	public static int search(int [] a , int value){
    
    
		for(int i = 0 ; i < a.length ; i ++){
    
    
			if(a[i] == value){
    
    
				return i;
			}			
		}
		return -1;
	}

	public static void main(String [] args){
    
    	
		int [] a = new int[]{
    
    1,4,2};
		int value = 3;
		System.out.println(search(a,value));
	}
}

这种查找是属于直接查找方式,效率是最低的,为什么会效率低,如果数组的长度非常长,如果是10000个,就需要比较10000次。这个代价是相当大的。

2.二分查找(Binary Search)

(1)要求:待查找的数组要有序。升序降序都可以。

(2)二分查找是在数组是有序的前提下,将数组一分为二,直接拿中间的元素与待查找的元素进行比较,如果中间的数小于待查找的数,因此,中间的数之前的数都会小于待查找的数,所以将中间的数之前的数全都忽略掉。肯定是不符合要求的。然后再将剩下的数再取中间数,然后再次与待比较数进行比较,依次比较,过滤掉中间数之前的数。

(3)简单说:排序取中间

public class ArrayBinarySearchTest
{
    
    
	public static int binarySearch(int [] a,int value){
    
    
		int low = 0 ; //数组中第一个元素的下标
		int high = a.length - 1;//数组中最后一个元素的下标
		//取中间元素。它是我们要跟待比较那个value值进行比较的那个元素它的索引在什么地方。
		int middle;
		//什么情况下让它一直能去进行判断,只要low不大于这个high就可以一直去判断。
		while(low <= high){
    
    
			//确定中间元素,索引的位置
			middle = (low + high)/2;
			
			for(int i = 0 ; i < a.length; i++){
    
    
				System.out.print(a[i]);
				if(i == middle){
    
    
					System.out.print("#");//标记一下中间元素的位置
				}
				System.out.print("   ");
			}
			System.out.println();

			//用中间元素与value进行比较
			if(a[middle]==value){
    
    
				return middle;
			}
			//如果没找到,有两种情况,一种是小于value,一种是中间的元素大于value,如果中间的元素小于value,则中间元素以及中间元素左边的元素都不要,
			//如果是大于的话,中间元素以及中间元素右边的也都不要
			if(a[middle]<value){
    
    
				low = middle + 1;//即将中间的元素与中间元素左边的元素都过滤掉,这时对最右边元素下标没有影响,只对最左边元素下标有影响
			}

			if(a[middle]>value){
    
    
				high = middle-1;//即将中间的元素与中间元素右边的元素都过滤掉。这时对最左边元素下标没有影响,只对最右边元素下标有影响
			}
		}
		return -1;
	}
	
	public static void main(String [] args){
    
    
		int[] a = new int[]{
    
    11,22,44,992,809,928,443,222};
		//冒泡排序
		for(int i = 0 ; i < a.length-1; i++){
    
    //为何length-1,length-1就是最后一个元素的下标
			for(int j = 0 ; j < a.length-i-1; j++){
    
    
				if(a[j]>a[j+1]){
    
    
					int temp = a[j];
					a[j] = a[j+1];
					a[j+1] = temp;
				}
			}
		}

		int value = 1;

		int index = binarySearch(a,value);
		System.out.println(index);
	}
}

猜你喜欢

转载自blog.csdn.net/xiogjie_67/article/details/108501189