二分搜索代码


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");

	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值