今天读“谷歌三大论文”看到了“二分查找”这个词,突然一点印象都没有了,记性是被狗吃去了么,最主要的是平时用的少,又没怎么去看他,快点打开书,又看了一遍,再敲了一遍,写点东西,算是再次复习一下。
所谓“二分查找”从字面就可以知道他的意思,一个是“分”一个就是“找”,“分”就是指把“分数据”“找”也就是找数据,唉,又废话了。
具体一个例子,我们要在数组中找一个数据,我们先找到中间的值,然后把要找的数据和中间值进行比较,如过比中间值大,我们就知道要在中间和最末尾之间去找了,反之在头和中间里面找。这样就去掉了一半的数据,再这样一直下去,一直分,一直找。。。当头下标比尾下标还要大的时候,也就不能再分了,如果还没找到,就说明数据不在里面。
一直分,一直找,动作都是一样的,这里我们的“递归”就要出场了,递归也就是自己调用自己。正好符合。“二分查找”就应用到了递归的思想。还要注意的是,能进行“二分查找”对数据是要有要求的。要求就是他们要有序,想想也知道,不然根本就查不到。因此我们在插入数据的时候就要将数据排好序。也就是下面的的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