- 二分查找其实占用的内存比较少,但是如果是寻找给定值的数据时,二分查找虽然占用内存小,但是用散列表或者二叉搜索树代替。
- 二分查找不适合非数组,也不适合数组一直在频繁的插入删除(因为要频繁排序)
- 二分查找的变体情况用的比较多,也就是搜索近似。
代码&测试如下:
import java.util.*;
public class BinSearch
{
//测试的主类
public static void main(String args[])
{
// int[] arr=new int[10];
// for(int i=0;i<10;++i)
// arr[i]=(int)(Math.random()*20);
// Arrays.sort(arr);
// for(int i=0;i<arr.length;++i)
// System.out.print(arr[i]+" ");
// System.out.println();
// //随机生成10个数,测试b1,b2
// System.out.println(bSearch(arr,3));
// System.out.println(bSearch2(arr,3));
// //测试哦bSearch3
int[] arr2={1,1,1,1,2,2,2,3,3,3};
// System.out.println(bSearch3(arr2,1));
// System.out.println(bSearch3(arr2,2));
// System.out.println(bSearch3(arr2,3));
//测试b4
// System.out.println(bSearch4(arr2,1));
// System.out.println(bSearch4(arr2,2));
// System.out.println(bSearch4(arr2,3));
// System.out.println(bSearch4(arr2,4));
//测试b5
// System.out.println(bSearch5(arr2,1));
// System.out.println(bSearch5(arr2,2));
// System.out.println(bSearch5(arr2,3));
// System.out.println(bSearch5(arr2,4));
//测试b6
System.out.println(bSearch6(arr2,1));
System.out.println(bSearch6(arr2,2));
System.out.println(bSearch6(arr2,3));
System.out.println(bSearch6(arr2,4));
}
//第一种二分搜索,适用与判断数组中有没有这个元素
public static boolean bSearch(int[] arr,int num)
{
int low=0;
int high=arr.length-1;
int mid;
while(low<=high)
{
//mid=(low+high)/2;
mid=low+((high-low)>>2);
if(arr[mid]==num)
return true;
else if(arr[mid]<num)
low=mid+1;
else
high=mid-1;
}
return false;
}
//第二种二分搜索,适用无重复元素,搜索num出现的唯一的下标
public static int bSearch2(int[] arr,int num)
{
int low=0;
int high=arr.length-1;
int mid;
while(low<=high)
{
//mid=(low+high)/2;
mid=low+((high-low)>>2);
if(arr[mid]==num)
return mid;
else if(arr[mid]<num)
low=mid+1;
else
high=mid-1;
}
return -1;
}
//第三种二分搜索,寻找有重复元素中的第一个元素的下标
public static int bSearch3(int[] arr,int num)
{
int low=0;
int high=arr.length-1;
int mid;
while(low<=high)
{
//mid=(low+high)/2;
mid=low+((high-low)>>2);
if(arr[mid]>num)
high=mid-1;
else if(arr[mid]<num)
low=mid+1;
else
{
if(mid==0||arr[mid-1]!=num)
return mid;
else
high=mid-1;
}
}
return -1;
}
//第四种二分搜索,寻找有重复元素中的最后一个元素的下标
public static int bSearch4(int[] arr,int num)
{
int low=0;
int high=arr.length-1;
int n=arr.length;
int mid;
while(low<=high)
{
//mid=(low+high)/2;
mid=low+((high-low)>>2);
if(arr[mid]>num)
high=mid-1;
else if(arr[mid]<num)
low=mid+1;
else
{
if(mid==n-1||arr[mid+1]!=num)
return mid;
else
low=mid+1;
}
}
return -1;
}
//第五种二分搜索,寻找第一个大于等于num的元素
public static int bSearch5(int[] arr,int num)
{
int low=0;
int high=arr.length-1;
int n=arr.length;
int mid;
while(low<=high)
{
//mid=(low+high)/2;
mid=low+((high-low)>>2);
if(arr[mid]>=num)
{
if(mid==0||arr[mid-1]<num)
return mid;
else
high=mid+1;
}
else
low=mid+1;
}
return -1;
}
//第六种二分搜索,寻找最后一个小于等于num的元素
public static int bSearch6(int[] arr,int num)
{
int low=0;
int high=arr.length-1;
int n=arr.length;
int mid;
while(low<=high)
{
//mid=(low+high)/2;
mid=low+((high-low)>>2);
if(arr[mid]<=num)
{
if(mid==n-1||arr[mid+1]>num)
return mid;
else
low=mid+1;
}
else
high=mid-1;
}
return -1;
}
}