数组的查找:在数组中寻找特定元素的过程。
1、线性查找法
算法思路:线性查找法是将要查找的关键字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;
}
}
2、二分查找法
前提:数组元素已经排序
假设数组已按升序排列,二分查找法将关键字与数组的中间元素比较;
(1)如果关键字比中间元素小,那么只需在前一半数组元素中查找。
(2)如果关键字和中间元素相等,则匹配成功,查找结束。
(3)如果关键字比中间元素大,则只需在后一半数组元素中查找。
在一个已经排序的数组中用二分法查找,只需要比较log2n+1次。
如果关键字在数列中,返回其下标。否则返回插入点下标加1的负值。
算法思路:首先让关键字key与数列的中间元素比较,数列的低下标low为0,高下标high为list.length-1。如果key小于list[mid],将high设为mid-1;如果key==list[mid],则匹配成功返回mid。如果key>list[mid]则将low设为mid+1,直到low>high或匹配成功。如果low>high,则返回-1-low,low是插入点。
代码实现:
public class BinarySearch{
public static int binarySearch(int[] list,int key){
int low = 0;
int high = list.length-1;
while(low<=high){
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;
}
}