什么是折半查找
折半查找是一种效率较高的查找算法。折半查找的先决条件是查找表中的数据元素排列必须是有序的。折半查找先以有序数列的中点位置为比较对象,如果要找的元素值小于搞中点元素,则将待查序列缩小为左半部分,否则为右半部分。通过一次比较,可以将查找的区间缩小一半,可以明显的减少比较的次数,提高查找效率。
方法分析
折半查找先以有序数列的中点位置为比较对象,比较会产生3中情况,一种是带查找值大于中间位置的数,此时我们要把比较期间缩小为有序数列的后半部分;一种是待查找值小于中间位置的数,此时我们要把比较区间缩小为有序数列的前半部分;一种是待查找值等于中点位置的书,此时查找成功。这样不断比较,知道查找成功或者区间小于0,就停止查找。
实现代码
package test.algorithm.FastSlowPointer;
/**
* 折半查找(二分查找)
* @author serenity
*
*/
public class BinarySearch {
/**
* 折半查找
* 返回元素位置,没找到返回-1
* @param data
* @param s
* @return
*/
public static int binarySearch(int[] data , int s){
int low = 0;
int high = data.length-1;
int mid = (high+low)/2;
int flag = -1;
int count = 0;
while(low<=high){
count++;
mid = (high+low)/2;
if(s<data[mid]){
//待查找值s小于中值
high = mid-1;
}else if(s>data[mid]){
//待查找值s大于中值
low = mid+1;
}else{
//待查找值s等于中值
flag = mid;
break;
}
}
System.out.println("查找次数:"+count);
return flag;
}
public static void main(String[] args) {
int[] data = {1,2,3,4,5,6,7,8,9,10};
System.out.print("数组:");
for(int i : data){
System.out.print(i+" ");
}
System.out.println();
int search = 4;
int position = binarySearch(data,search);
System.out.println("值"+search+"的元素位置为:"+position);
}
}