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

  1. 2. 查找。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的数据。




  2. package com.suanfa;  
  3.   
  4. import java.io.BufferedReader;  
  5. import java.io.File;  
  6. import java.io.FileInputStream;  
  7. import java.io.InputStreamReader;  
  8. import java.util.ArrayList;  
  9. import java.util.List;  
  10.   
  11. public class mychaz {  
  12.   
  13.     /**顺序查找和二分查找 
  14.      * @param args 
  15.      */  
  16.     public static void main(String[] args) {  
  17.          String pathBubble="src/largeW_bubble.txt";  
  18.          String pathTinyW="src/tinyW.txt";  
  19.          try{  
  20.              File fileBubble=new File(pathBubble);  
  21.              InputStreamReader reader=new InputStreamReader(new FileInputStream(fileBubble));  
  22.              BufferedReader buffereader=new BufferedReader(reader);  
  23.              List<String> list=new ArrayList<String>();  
  24.              String num="";  
  25.              //读取largeW_bubble.txt已排序好的文本数据存放到数组中  
  26.              while((num=buffereader.readLine())!=null){  
  27.                  list.add(num.trim());  
  28.              }  
  29.              int array[]=new int[list.size()];  
  30.              for(int i=0;i<array.length;i++){  
  31.                  array[i]=Integer.parseInt(list.get(i));  
  32.              }  
  33.                
  34.              //读取tinyW.txt的数据并且在largeW_bubble.txt已排序好数组中查找  
  35.              File fileTinyW=new File(pathTinyW);  
  36.              buffereader=new BufferedReader(new InputStreamReader(new FileInputStream(fileTinyW)));  
  37.              while((num=buffereader.readLine())!=null){  
  38.                  //非递归的方式二分查找  
  39.                  int location = binarySearch(array,0,array.length-1,Integer.parseInt(num.trim()));  
  40.                  if(location!=-1){  
  41.                      //System.out.println("二分查找中tinyW.txt的数据在largeW_bubble.txt中位置是:"+location+" 所对应的数据是:"+array[location]);  
  42.                  }else {  
  43.                      System.out.println("二分查找中找不到 所对应的数据:"+num);  
  44.                  }  
  45.                  //顺序查找  
  46.                  location=SSearch(array,0,array.length-1,Integer.parseInt(num.trim()));  
  47.                  if(location!=-1){  
  48.                     System.out.println("顺序查找中tinyW.txt的数据在largeW_bubble.txt中位置是:"+location+" 所对应的数据是:"+array[location]);  
  49.                  }else{  
  50.                      System.out.println("顺序查找中找不到 的数据是:"+num);  
  51.                 }  
  52.              }  
  53.          }catch (Exception e) {  
  54.              e.printStackTrace();  
  55.         }  
  56.            
  57.   
  58.     }  
  59.   
  60.     /** 
  61.      * 使用非递归的方式实现二分查找 
  62.      * @param array 有序数组 
  63.      * @param low 左下标 
  64.      * @param high 右下标 
  65.      * @param target 待查找的元素 
  66.      * @return 
  67.      */  
  68.     public static int  binarySearch(int array[], int low, int high, int target){  
  69.         while(low<=high){  
  70.             int middle=(low+high)/2;  
  71.             if(target>array[middle]){  
  72.                 low=middle+1;  
  73.             }else if(target<array[middle]){  
  74.                 high=middle-1;  
  75.             }else{  
  76.                 return middle;  
  77.             }  
  78.         }  
  79.         return -1;  
  80.     }  
  81.     /** 
  82.      * 使用递归实现二分查找 
  83.      * @param array 有序数组 
  84.      * @param low 左下标 
  85.      * @param high 右下标 
  86.      * @param target 待查找的元素 
  87.      * @return  
  88.      */  
  89.     public static int BSearch(int array[], int low, int high, int target ){  
  90.         int middle=(low+high)/2;  
  91.         if(low>high||target<array[low]||target>array[high]){  
  92.             return -1;  
  93.         }  
  94.           
  95.         if(target<array[middle]){  
  96.             return BSearch(array,low,middle-1,target);  
  97.         }else if(target>array[middle]){  
  98.             return BSearch(array,middle+1,high,target);  
  99.         }else{  
  100.             return middle;  
  101.         }  
  102.     }  
  103.       
  104.     /** 
  105.      * 顺序查找 
  106.      * @param array 有序数组 
  107.      * @param low 左下标 
  108.      * @param high 右下标 
  109.      * @param target 待查找的元素 
  110.      * @return 
  111.      */  
  112.     public static int SSearch(int array[], int low, int high, int target ){  
  113.         for(int i=low;i<high;i++){  
  114.             if(target==array[i]){  
  115.                 return i;  
  116.             }  
  117.         }  
  118.         return -1;  
  119.     }  
  120. }  



 
运行结果如下:

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值