(1)递归思想实现元素的二分法查找
package org.media; import java.util.Arrays; public class GoTest{ public static void main(String args[]){ int a[]={0,1,9,5,7}; Arrays.sort(a); System.out.println(binSearch(a,0,a.length-2,5)); } public static int binSearch(int a[], int start, int end, int key) {
int mid = (end - start) / 2 + start;
if (a[mid] == key) { return mid; } if (start >= end) { return -1; } else if (key>a[mid]) { return binSearch(a, mid + 1, end, key); } else if (key<a[mid]) { return binSearch(a, start, mid - 1, key); } return -1; } } |
//在上面的算法中必须保证元素是按照升序排列的。
int min(end-start)/2+start;
得到中间位置的索引,将中间位置索引对应的元素与要查找的元素key进行比较。
如果索引位置的对应值正好等于key的值。则返回中间位置的索引即为查找的元素的索引。
如果key的值大于中间位置的值,也就是说key的值在中间位置的“后半部分”(升序排列)这时再将原来的中间位置向后挪动一位变为重新 折半分的 起始索引位置。终止索引位置不变,再进行查找key的值。若是key的值再大于重新确定的mid的值,再重复上面操作,如此递归……
如果key的值小于中间位置的值,也就是说key的值在中间位置的“前半部分”,这时再将原来的中间位置向前挪动一位变为重新 折半分的 终止位置。……同样也是这样递归。
当起始位置的索引大于或等于终止未指定的索引时,返回 -1 表示错误。
当mid的值为小数时,取小于它的最大整数作为中间位置。
(1)普通循环实现二分法查找
package org.media; import java.util.Arrays; public class GoTest{ public static void main(String args[]){ int a[]={9,7,6,5,2}; Arrays.sort(a); System.out.println(binSearch(a,9)); } public static int binSearch(int array[],int key){ int mid=array.length/2; int start =0; int end=array.length-1; if(key==array[mid]) return mid; while(start<=end){ mid=(end-start)/2+start; if(key <array[mid]){ end=mid-1; }else if(key >array[mid]){ start=mid+1; }else{ return mid; } } return -1; } } |
//在使用二分法之前需要对元素进行升序排列
传递一个数组和要查找的元素调用binSearch()方法。
同样取得数组的中间位置作为比较的起始位置。
先将值遇arrray[mid]进行比较,当二者相等的时候,返回mid的位置即为查找的值的索引。使用start<=end作为条件进行循环。当值小于当前的array[mid]时,当前mid的索引值前移一位,因为key的值在mid的前面。
……同样的思想分析当key>=array[mid]也是合理的。
当不符合要求(没有按照升序或start>end)时,就会返回 -1 。