(执行时间)编写程序,随机产生100000个整数值和一个关键字。估算一下调用程序清单6-6中的linearSearch方法的执行时间。对该数组进行排序,然后估算调用程序清单6-7中的binarySearch方法的执行时间。可以使用下面的代码模板获取执行时间:
long startTime = System.currentTimeMillis();
perform the task;
long endTime = System.currentTimeMillis();
long executionTime = endTime - startTime;
线性查找法(Linear Search):将要查找的关键字key与数组(数组中的元素可以任意顺序排列)中的元素逐个进行比较。这个过程持续到在列表中找到与关键字匹配的元素,或者查完列表也没有找到关键字为止。如果匹配成功,线性查表法返回与关键字匹配的元素在数组中的下标。如果没有匹配成功,则返回-1.
public class LinearSearch {
public static int linearSearch(int[] list , int key){
for(int i=0;i<list.length;i++){
if(key == list[i])
return i;
}
return -1;
}
}
将关键字与数组的中间元素进行比较,
如果关键字小于中间元素,只需要在数组的前一半元素中继续查找关键字;
如果关键字等于中间元素,则匹配成功,查找结束;
如果关键字大于中间元素,只需要在数组的后一半元素中继续查找关键字
线性查找法适用于在小数组或没有排序的数组中查找,但是对大数组而言效率不高。
二分查找法的效率较高,但它要求数组已经排好序。
public class BinarySearch {
public static int binarySearch(int[] list,int key){
int low =0;
int high=list.length-1;
while(high>=low){
int mid=(low+high)/2;
if(key<list[mid])
high=mid-1;
else if(key==list[mid])
return mid;
else
low=mid+1;
}
return -low-1;
}
}
import java.util.Arrays;
public class Exercise6_16 {
public static void main(String[] args){
int[] list = new int[100000];
for(int i=0;i<100000;i++){
list[i]=(int)(Math.random()*100001);
}
int key=(int)(Math.random()*100001);
long startTime = System.currentTimeMillis();
System.out.println(LinearSearch.linearSearch(list,key));
long endTime = System.currentTimeMillis();
long executionTime = endTime - startTime;
System.out.println("Execution time for linearSearch is: "+executionTime);
Arrays.sort(list);
startTime = System.currentTimeMillis();
System.out.println(BinarySearch.binarySearch(list,key));
endTime = System.currentTimeMillis();
executionTime = endTime - startTime;
System.out.println("Execution time for binarySearch is: "+executionTime);
}
}