查找: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();
}
}