排序算法之 二分法查找

算法:

     当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的(如果数据是无序的,可以调用Arrays.sort(数组变量名)进行排序)。现在我们假定数组是有序的,至于排序的算法我们会一一讲述。

二分查找主要思想是:(设查找的数组区间为array[start, end])

(1)确定该期间的中间位置K (=(start+end)/2)

(2)将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。

   区域确定如下:a.array[k]>T 由数组的有序性可知array[k,k+1,……,end]>T;

   故新的区间为array[start,……,K-1]b.array[k]<T 类似上面查找区间为array[k+1,……,end]。

   每一次查找与中间值比较,可以确定是否查找成功,不成功当前查找区间缩小一半。递归找,即可,时间复杂度:O(log2n)。

假如有一组数为2,3,4,5,6,11,13,22,35要查给定的值5(x).可设三个变量start,mid,end分别指向数据的上界,中间和下界,mid=(start+end)/2。
1.开始令start=0(指向2),end=8(指向35),则mid=4(指向6)。因为mid>x,故应在前半段中查找。
2.令新的end=mid-1=3,而front=0不变,则新的mid=1。此时x>mid,故确定应在后半段中查找。
3.令新的start=mid+1=2,而end=3不变,则新的mid=2,此时a[mid]<x,故确定应在后半段中查找。比较a[end]=x,查找成功。
例:在有序的有N个元素的数组中查找用户输进去的数据x。
算法如下:
1.确定查找范围start=0,end=N-1,计算中项:mid=(start+end)/2。 //N表示数组的长度
2.若a[mid]=x或start>=end,则结束查找;否则,向下继续。
3.若a[mid]<x,说明待查找的元素值只可能在比中项元素大的范围内,则把mid+1的值赋给start,并重新计算mid,转去执行步骤2;
若a[mid]>x,说明待查找的元素值只可能在比中项元素小的范围内,则把mid-1的值赋给end,并重新计算mid,转去执行步骤2。

例:数组arr = { 2, 5, 11, 3, 22, 6, 13, 35, 4 };

进行二分查找以前要对数组排序,调用Arrays.sort()方法,确保数组是有序的,才能使用二分查找。

<span style="font-size:18px;">public class BinarySearch {

	/** 
     * 二分查找 
     * 简介:  在二分搜寻法中,从数列的中间开始搜寻,如果这个数小于我们所搜寻的数,由于数列已排序,则该数左边的数一定都小于要搜寻的对象, 
     *      所以无需浪费时间在左边的数;如果搜寻的数大于所搜寻的对象,则右边的数无需再搜寻,直接搜寻左边的数。 
     * @param arr 待查找数组 
     * @num 待查找数 
     */  
   
    public static int binarySearch(int[] arr,int num){
    	
    	int start = 0;
    	int end = arr.length-1;
    	while(start <= end){
    		int mid = (start + end)/2;
    		if(num > arr[mid]){
    			start = mid +1 ;
    		}else if(num < arr[mid]){
    			end = mid -1;
    		}else{
    			return mid;
    		} 		
    	}
    	return -1 ;
    }
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = { 2, 5, 11, 3, 22, 6, 13, 35, 4 };  
        //对数组进行排序  调用Arrays类的sort()方法
        Arrays.sort(arr);
          
        int find = binarySearch(arr,5);  
          
        if (find != -1) {  
            System.out.println("找到数值于索引:" + find);  
        } else {  
            System.out.println("找不到数值");   
        }  
	}

}</span>

显示结果:数值5的索引:3

本文参考:

http://www.cnblogs.com/sunzn/archive/2013/02/13/2910897.html

百度百科二分法查找

    原文作者:查找算法
    原文地址: https://blog.csdn.net/promise_love/article/details/42777217
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞