①顺序查找:
顺序查找本身就是暴力遍历进行判断。
public static int sequentialSearch(int[] a, int key) {
for (int i = 0; i < a.length; i++) {
if (a[i] == key){
return i;
}
}
return -1;
}
在此之上因为for循环每次还要去比较是否越界,添加哨兵进行管理:
public static int sequentialSearch2(int[] a, int key) {
int index = a.length - 1;
a[0] = key;
while (a[index] != key) {
index--;
}
return index;
}
从数组最后一个元素开始,将数组第一个元素设置为哨兵(即值为目标值,即使第一个数为目标值,也会遍历结束返回,所以此处覆盖值不影响)
时间复杂度O(N)
②二分查找:
前提是数据数组已经顺序。
public static int halfFind(int[] v, int target) {
int mid = 0;
int base=0;
int top=v.length-1;
while(base<=top){
mid=(top+base)/2;
if(v[mid]==target) {
return mid;
}
if(v[mid]<target) {
base=mid+1;
}
if(v[mid]>target) {
top=mid-1;
}
}
return -1;
}
二分查找由双指针启动,指向头尾,中值下标可以用(头+尾)/2得到,截止条件就是头尾相遇或找到该值;若中值比目标值大,说明目标值在中值右侧,将头设置为中值下一位;若小,则在中值左侧,头设置为中值前一位即可。
边界查找:
public static int halfBorder(int[] v, int target) {
int mid = 0;
int base=0;
int top=v.length-1;
while(base<=top){
mid=(top+base)/2;
if(v[mid]<target) {
base=mid+1;
}
if(v[mid]>=target) {
top=mid-1;
}
}
return base;
}
边界与准确值查找区别就是返回mid还是返回下标,如查值时,找不到返回-1,而边界就是找不到应范围最边下标。查找边界截止条件就是头尾相遇即可。
时间复杂度O(log2N)