二分查找:
二分查找也被称为折半查找,顾名思义就是将一个有序数列分成两半,而如果需要查找的数存在则必然会在这这两部分的数列当中,这是就只需要判断这个这个数是大于还是小于这个有序数列的中间的值,不管是大于还是小于都能确定其中有一半里面不会存在需要查找的值,就可以不用在这一半的有序数列中进行查找,减少了判断的次数,每次判断都会缩小区间,直到区间不能再缩小的时候就说明找到了这个数。
代码实现:
public class Test7 {
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6};
int target = 1;
if (array == null) {
return;
}
int start = 0;
int end = array.length - 1;
while (start <= end) {
int mid = start + (end - start) / 2;
if (array[mid] == target) {
System.out.println(mid);
return;
} else if (target < array[mid]) {
end = mid - 1;
} else {
start = mid + 1;
}
}
System.out.println("没有该元素");
}
}
思路:
实现二分查找首先需要判断被有序数列是否为null,一个为null的数列是没有查找的必要的。
如果有序数列不为null,就需要找到这个有序数列的中间元素,判断需要查找的数是否是需要查找的数,不是则判断查找数是否小于数组的中间元素(array[mid]),如果小于则把最后的元素(end)变为中间元素的前一个数(array[mid]-1)。然后重复此过程,因为使用二分查找必须是有序数列,所以最左边(start)是不可能大于最右边(end)的,而当最左边(start)等于最右边(end)则表示这是最后一个可能是查找数。所以只要当最右边(end)小于最左边(start)的时候就代表着该数组中没有着个元素。
开始未判断的有序数列:
第一次判断后,剩下的数(因为该数组长度为6,而end是int型数据类型所以中间元素是array[2]):
查找出答案:
二分查找的优缺点:
缺点:使用二分查找的时候需要确保该数列是一个有序数列,如果不是有序数列则可能无法找到这个数据,并且它只能返回一个值, 如果查找数值在数组中存在多个, 不能把存在的值全部返回, 还有若是数组中存在一些不能单纯的比较大小的元素(比如字符串), 就不能根据元素的自然顺序对数组进行排序,就无法使用二分查找。
优点:二分查找每一次判断即可筛选掉一半元素, 比全遍历查找的方法的效率高。所以二分查找一般用于判断一个元素是否存在于一个有序数列中。