-
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的数据。
-
-
-
- package com.suanfa;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.InputStreamReader;
- import java.util.ArrayList;
- import java.util.List;
- public class mychaz {
- /**顺序查找和二分查找
- * @param args
- */
- public static void main(String[] args) {
- String pathBubble="src/largeW_bubble.txt";
- String pathTinyW="src/tinyW.txt";
- try{
- File fileBubble=new File(pathBubble);
- InputStreamReader reader=new InputStreamReader(new FileInputStream(fileBubble));
- BufferedReader buffereader=new BufferedReader(reader);
- List<String> list=new ArrayList<String>();
- String num="";
- //读取largeW_bubble.txt已排序好的文本数据存放到数组中
- while((num=buffereader.readLine())!=null){
- list.add(num.trim());
- }
- int array[]=new int[list.size()];
- for(int i=0;i<array.length;i++){
- array[i]=Integer.parseInt(list.get(i));
- }
- //读取tinyW.txt的数据并且在largeW_bubble.txt已排序好数组中查找
- File fileTinyW=new File(pathTinyW);
- buffereader=new BufferedReader(new InputStreamReader(new FileInputStream(fileTinyW)));
- while((num=buffereader.readLine())!=null){
- //非递归的方式二分查找
- int location = binarySearch(array,0,array.length-1,Integer.parseInt(num.trim()));
- if(location!=-1){
- //System.out.println("二分查找中tinyW.txt的数据在largeW_bubble.txt中位置是:"+location+" 所对应的数据是:"+array[location]);
- }else {
- System.out.println("二分查找中找不到 所对应的数据:"+num);
- }
- //顺序查找
- location=SSearch(array,0,array.length-1,Integer.parseInt(num.trim()));
- if(location!=-1){
- System.out.println("顺序查找中tinyW.txt的数据在largeW_bubble.txt中位置是:"+location+" 所对应的数据是:"+array[location]);
- }else{
- System.out.println("顺序查找中找不到 的数据是:"+num);
- }
- }
- }catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 使用非递归的方式实现二分查找
- * @param array 有序数组
- * @param low 左下标
- * @param high 右下标
- * @param target 待查找的元素
- * @return
- */
- public static int binarySearch(int array[], int low, int high, int target){
- while(low<=high){
- int middle=(low+high)/2;
- if(target>array[middle]){
- low=middle+1;
- }else if(target<array[middle]){
- high=middle-1;
- }else{
- return middle;
- }
- }
- return -1;
- }
- /**
- * 使用递归实现二分查找
- * @param array 有序数组
- * @param low 左下标
- * @param high 右下标
- * @param target 待查找的元素
- * @return
- */
- public static int BSearch(int array[], int low, int high, int target ){
- int middle=(low+high)/2;
- if(low>high||target<array[low]||target>array[high]){
- return -1;
- }
- if(target<array[middle]){
- return BSearch(array,low,middle-1,target);
- }else if(target>array[middle]){
- return BSearch(array,middle+1,high,target);
- }else{
- return middle;
- }
- }
- /**
- * 顺序查找
- * @param array 有序数组
- * @param low 左下标
- * @param high 右下标
- * @param target 待查找的元素
- * @return
- */
- public static int SSearch(int array[], int low, int high, int target ){
- for(int i=low;i<high;i++){
- if(target==array[i]){
- return i;
- }
- }
- return -1;
- }
- }
运行结果如下: