您的位置:首页 > 其它

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

2014-06-12 07:58 337 查看
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.zuoye;

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 FourZuoye {

/**顺序查找和二分查找
* @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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: