写在最前面
导师贪腐出逃美国,两年未归,可怜了我。拿了小米和美团的offer,要被延期,offer失效,工作重新找。把准备过程纪录下来,共勉。
线性查找
public static int search(int[] data, int target) {
for(int i = 0; i < data.length; i++){
if(data[i] == target){
return i;
}
}
return -1;
}
二分查找
二分查找(英语:binary search),也称折半查找(英语:half-interval search)、对数查找(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。 搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的 那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。 - from 维基百科
二分法首先考察中间元素a[mid],如果该值是我们要找的值,那好极了,直接找到了;如果不是的话,由于我们已经知道数组是排好序的(二分法要求待查找的数组是有序的,本例假设是升序的,降序其实是一样的),那就看目标值target和a[mid]的关系是怎样的:如果a[mid] > target则说明目标值target如果存在的话一定在a[mid]的左侧,因为左侧都比a[mid]小;如果a[mid] < target则说明目标值如果存在的话一定在a[mid]的右侧,因为右侧都比a[mid]大。
递归法
public static int binarySearch1(int[] data, int low, int high, int target) {
int mid = (low + high) / 2;
if(low <= high){
if(target < data[mid]){
binarySearch1(data, low, mid - 1, target);
}else if(target > data[mid]){
binarySearch1(data, mid + 1, high, target);
}else{
return mid;
}
}
return -1;
}
迭代
public static int binarySearch2(int[] data, int low, int high, int target){
int mid = (low + high) / 2;
while(low <= high){
if(target < data[mid]){
high = mid - 1;
}else if(target > data[mid]){
low = mid + 1;
}else{
return mid;
}
}
return -1;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。