重走算法路之二分查找

        今天读“谷歌三大论文”看到了“二分查找”这个词,突然一点印象都没有了,记性是被狗吃去了么,最主要的是平时用的少,又没怎么去看他,快点打开书,又看了一遍,再敲了一遍,写点东西,算是再次复习一下。

       所谓“二分查找”从字面就可以知道他的意思,一个是“”一个就是“”,“分”就是指把“分数据”“找”也就是找数据,唉,又废话了。

       具体一个例子,我们要在数组中找一个数据,我们先找到中间的值,然后把要找的数据和中间值进行比较,如过比中间值大,我们就知道要在中间和最末尾之间去找了,反之在头和中间里面找。这样就去掉了一半的数据,再这样一直下去,一直分,一直找。。。当头下标比尾下标还要大的时候,也就不能再分了,如果还没找到,就说明数据不在里面。

       一直分,一直找,动作都是一样的,这里我们的“递归”就要出场了,递归也就是自己调用自己。正好符合。“二分查找”就应用到了递归的思想。还要注意的是,能进行“二分查找”对数据是要有要求的。要求就是他们要有序,想想也知道,不然根本就查不到。因此我们在插入数据的时候就要将数据排好序。也就是下面的的insertSorted();方法

        下面上代码,注释应该有那么清楚吧:

         

package 二分查找法;

public class BinarySearch {
	private long[] arr;
	private int nElem;
	
	/*
	 * 构造函数初始化数组和元素个数
	 */
	public BinarySearch(int max) {
		arr = new long[max];
		nElem = 0;
	}

	/*
	 * 得到数组中的元素个数
	 */
	public int getSize() {
		return nElem;
	}
	
	/*
	 * 找到相应的元素的方法
	 */
	public long find(long keySearch) {
		return binarySearch( keySearch,0,nElem-1);
	}

	/*
	 * 二分查找的方法
	 */
	private long binarySearch(long keySearch, int head, int end ) {
		int mid = (head+end)/2;          //找到中间的位置
		if(arr[mid]==keySearch) {        //要找的数据在数组的中间位置
			return mid;                  //返回下标
		}
		else if(head > end) {            //头到尾后面去了,说明没找到
			return nElem;                
		}
		
		else{                           //递归调用
			if(keySearch < arr[mid]) {  //要查找的值比中间值小
			  return binarySearch(keySearch, head, mid-1);   //说明要找的在head--mid-1之间
			}
			else 
			  return binarySearch(keySearch, mid+1, end);   //要找的数据比中间值要大,数据在mid+1--end之间
		}
	}
	
	/*
	 * 在数组中插入一个元素,由于二分查找法针对的是已经排好序的数据,
	 * 所以在构造数组的时候就要使数组中的元素是有序的。
	 */
	public void insertSorted(long value) { 
		int j;
		for(j = 0; j < nElem; j++) {  
			if(arr[j]>value)          //如果要插入的值在中间,跳出循环,转到下一步
				break;
		}
		for(int k = nElem; k > j;k--) {  //将数据往后面移动一个位置
			arr[k] = arr[k-1];
		}
		arr[j] = value;                 //将新的数据放在正确的位置
		nElem ++;                       //元素数量加1
	}
	
	/*
	 * 打印出数组中的每一个元素
	 */
	public void display() {
		for(int i = 0; i < nElem; i++) {
			System.out.print("arr["+i+"]="+arr[i]+" ");
		}
	}
	
	public static void main(String[] args) {
		BinarySearch bs = new BinarySearch(20);
		bs.insertSorted(23);
		bs.insertSorted(5);
		bs.insertSorted(2);
		bs.insertSorted(13);
		bs.insertSorted(230);
		bs.insertSorted(30);
		bs.insertSorted(123);
		bs.insertSorted(53);
		bs.insertSorted(32);
		bs.insertSorted(163);
		bs.insertSorted(2930);
		bs.insertSorted(350);
		
		System.out.println("打印出数组中的数据:");
		bs.display();
		System.out.println();
		System.out.println("元素的个数为:"+bs.getSize());
		
		int keysearch = 163;
		long value = bs.find(keysearch);
		System.out.println("要查找的数为:"+keysearch+" 位置为:"+value);
		
	}

}

   

    打印结果:

    

打印出数组中的数据:
arr[0]=2 arr[1]=5 arr[2]=13 arr[3]=23 arr[4]=30 arr[5]=32 arr[6]=53 arr[7]=123 arr[8]=163 arr[9]=230 arr[10]=350 arr[11]=2930 
元素的个数为:12
要查找的数为:163 位置为:8

    

 

你可能感兴趣的:(二分查找,排序,递归)