数组查找
数组查找指在一组数字中发现指定元素的过程,对于未排序的数组查找使用线性查找,对已排好序的数组使用二分查找
线性查找法
从头遍历查找数组,找到返回下标,未找到返回-1
public static int LinearSearch(int[] array, int value) {
for (int i = 0; i < array.length; i++) {
if (value == array[i]) {
return i;
}
}
return -1;
}
比较次数(与数组数量n有关和所查找元素位置有关)
- 最坏情况——元素不存在或在末尾,则需遍历全部元素,即比较次数为n
时间复杂度
- O(n)
二分查找法
二分查找只能查找排好序的数组,递归比较中间的元素,可得知目标元素是在数组左边还是右边,不断缩小范围从而找到目标元素下标(或未找到返回-1)
递归实现二分查找
public static int BinarySearch(int[] array, int value) {
return Search(array, 0, array.length - 1, value);
}
private static int Search(int[] array, int from, int to, int value) {
if (from > to) {
return -1;
}
int mid = from + (to - from) / 2;
if (value < array[mid]) {
return Search(array, from, mid - 1, value);
}
if (value > array[mid]) {
return Search(array, mid + 1, to, value);
}
return mid;
}
非递归实现二分查找
public static int BinarySearch(int[] array, int value) {
int from = 0;
int to = array.length - 1;
while (from <= to) {
int mid = from + (to - from) / 2;
if (value < array[mid])
to = mid - 1;
else if (value > array[mid])
from = mid + 1;
else
return mid;
}
return -1;
}
比较次数(与数组数量n有关和所查找元素位置有关)
- 最坏情况——每轮只需要和中间元素比较一次,n个元素,平分log2n次后就只剩下一个元素了,即最多重复log2n次就能找到元素返回下标(或未找到返回-1)
时间复杂度
- O( [ log2n ] ) = logn