import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.Random;
public class BinarySearch {
/*
* 二分搜索的输入为非降序的数组,要查找的数,n为数组的长度
*/
public static int binarySearch(int []a,int x,int n){
/*
* 其基本思想是从中间开始找,比它小从左边的中间开始找,比它大从右边的中间开始找
* 其查找速度是所有算法中最快的(除了哈希之外),但它对数组的要求比较高
* 其最坏的时间复杂度为logn
*/
int left=0;int right=n-1;
while(left<=right){
int middle=(left+right)/2;
if(a[middle]==x) return middle;//如果中间的数相等的话,直接返回
if(x>a[middle]) left=middle+1;//找右边
else right=middle-1;//找左边
}
return -1;//数组的长度为0时直接返回-1;
}
public static void main(String[] args) {
int n=10000;//n为数组的长度
int a[]=new int[n];
int max=1000; //随机数的最大值
int min=0; //随机数的最小值
//生成随机数
Random random = new Random();
/*
* 用两个表达式是因为第二个表达式的最小值如果是0的话,不会产生max,
* 随机数random的范围是[0,1)
*/
if(min==0)
for(int i=0;i<a.length;i++)
a[i]= random.nextInt(max+1);
else
for(int i=0;i<a.length;i++)
a[i]= random.nextInt(max)%(max-min+1) + min;
Merge.mergeSort(a, 0, a.length-1);//创建完数组后对数组进行排序,形成非降序排列的数组
try {
/*
* try里面将a[i]以流的方式输出到文件中
* 文件名为test,路径为D盘下的wenjian下的binarySearch,文件名为test
*/
FileOutputStream out=new FileOutputStream("D:/wenjian/binarySearch/test.txt");//文件路径
PrintStream p=new PrintStream(out);
for(int i=0;i<a.length;i++)
p.println(a[i]+" "+i);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
int x=10;//x为要找的数,若x在数组a中存在,输出x的下标,不存在输出-1
long startTime = System.currentTimeMillis();//获取当前时间
x=binarySearch(a, x, a.length);//执行二分查找
long endTime = System.currentTimeMillis();//获取程序结束后的时间
System.out.println(x);//输出x所在的下标位置
/*
* 程序运行时间是指进行进行纯二分查找的时间,不包括输入输出的时间
*/
System.out.println("程序运行时间:"+(endTime-startTime)+"ms");
}
}
二分搜索代码
最新推荐文章于 2024-08-02 18:57:38 发布