第三周作业——顺序查找和二分查找

本文介绍了一种使用二分查找算法来查找指定元素的方法,并通过实际编程实现比较了二分查找与顺序查找的效率。文章展示了如何从文件中读取数据,并在数组中查找这些数据,同时使用了哨兵技术来简化边界条件的处理。

查找:Bentley在他的著作《Writing Correct Programs》中写道,90%的计算机专家不能在2小时内写出完全正确的二分搜索算法。

    二分查找方法原型:int BSearch(int array[], int low, int high, int target ), array——含有若干整数的数组,low 与 high——查找的起始、结束下标,target——待查找的元素。
    顺序查找:int SSearch(int array[], int low, int high, int target ),其中S——Sequence(顺序)
    数组array中数据来自于第1题中的排序结果文件largeW_bubble.txt,待查找数据来自于文件 tinyW.txt下载链接)。请在控制台输出不在largeW_bubble.txt的数据。
      顺序查找:(方法上有点出入,每个人有不同的做法,也可以按老师的要求去做)因为用到哨兵,所以没有按要求做。

package exercise3;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class seqSearch {
	private static BufferedReader bufferedreader;  
	private static BufferedReader bufferedreader2;
	public static void main(String[] args)throws IOException {
		
		//把需数据库文件读入并保存在一个文件夹里
		bufferedreader = new BufferedReader(new InputStreamReader(new FileInputStream(
				new File("C:\\Users\\\\Desktop\\largeW_merge.txt")), "gb2312"));   
		String getData="";  
		int num=0;  
		List<Integer> list=new ArrayList<Integer>();  
		while((getData=bufferedreader.readLine())!=null){  
			num=num+1;  
			list.add(Integer.parseInt(getData.trim()));  
	    }  
		Integer[] dataAPI=new Integer[num+1];
	    Integer[] dataArray=(Integer[])list.toArray(dataAPI); 
	    dataArray[num]=-2;//由于查找的数据都是正数,把这个当作哨兵,放在数组的结尾,这样从头开始查找,
	                        //有哨兵就不会担心会越界,也不用经常判断是否越界。
	    
	    //把要查找的元素的文件读入到一个数组里
	    bufferedreader2 = new BufferedReader(new InputStreamReader(new FileInputStream(
	    		new File("C:\\Users\\\\Desktop\\tinyW.txt")), "gb2312"));   
		String getSearchData="";  
		int k=0;  
		List<Integer> list2=new ArrayList<Integer>();  
		while((getSearchData=bufferedreader2.readLine())!=null){  
			k++;  
			list2.add(Integer.parseInt(getSearchData.trim()));  
	    }  
	    Integer[] getSearchData2=(Integer[])list2.toArray(new Integer[k+1]); 
	    getSearchData2[k]=-2; //哨兵站岗
	    
	    long timeStart=System.currentTimeMillis(); 
	    
	    //实现顺序查找
//	    startSearch(dataArray,getSearchData2);
	   
	    //实现二分查找
	    startSearch2(dataArray,getSearchData2);
	    
	    long timeEnd=System.currentTimeMillis(); 
	    
	    //顺序查找输出时间:
//	    System.out.println("largeW.txt文本中总共有:"+num+"个数据!!!对现在的我们来说好吓人啊~~~ OoO\n"
//	    +"顺序查找所花费的时间是:\n"+(timeEnd-timeStart)*1000000
//	    +"纳秒  \n 哈哈!吓到了吧,那么鬼长!我故意的,你咬我啊!(胡一菲的话真是好用*o*)");	  
	    
	    //二分查找输出的时间:
	    System.out.println("largeW.txt文本中总共有:"+num+"个数据!!!对现在的我们来说好吓人啊~~~ OoO\n"
	    	    +"二分查找所花费的时间是:\n"+(timeEnd-timeStart)*1000000
	    	    +"纳秒  \n 哈哈!吓到了吧,那么鬼长!我故意的,你咬我啊!(胡一菲的话真是好用*o*)");	
	}
	
	//顺序查找
/*	public static void startSearch(Integer[] arr,Integer[] arr2){
		boolean a=false;		
		for(int i=0;arr2[i]!=-2;i++){
			for(int j=0;arr[j]!=-2;j++){
				if(arr2[i]==arr[j]){
					a=true;
					break;					
				}
				a=false;		
			}
			if(a!=true)
				 System.out.println(arr2[i]);
		}
	}*/
	
	//二分查找
	public static void startSearch2(Integer[] arr,Integer[] arr2){
			
			System.out.println("比较后不存在的数有以下:");
			for(int i=0;arr2[i]!=-2;i++){
				boolean a=false;
				int low=0,heigh=arr.length-2;//之所以减2,是因为这个数组组后一个数是哨兵。
				int mid = -1;
					while(low<=heigh){
					    mid=(low+heigh)/2;
					    
						if(arr2[i]<arr[mid])
							{heigh=mid-1;
						}
						else if(arr2[i]>arr[mid])
							low=mid+1;
								else{
									a=true;
									break;
								}
					}		
				if(a!=true)
				System.out.print(arr2[i]+"  ");
			}
			System.out.println();
	}	
	
}


 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值