二分查找
在计算机科学中,二分搜索(英语:binary search),也称折半搜索(英语:half-interval search)[1]、对数搜索(英语:logarithmic search)[2],是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
二分搜索在情况下的复杂度是对数时间,进行 O(logn) 次比较操作 n 在此处是数组的元素数量, O 是大O记号,(log 是对数)。二分搜索使用常数空间,无论对任何大小的输入数据,算法使用的空间都是一样的。除非输入数据数量很少,否则二分搜索比线性搜索更快,但数组必须事先被排序。尽管特定的、为了快速搜索而设计的数据结构更有效(比如哈希表),二分搜索应用面更广。
二分查找与顺序查找的区别
二分查找的条件
-
必须是有序数组
-
查找数量只能是1个而不是多个
import java.util.Scanner; public class BinarySearch { public static void main(String[] args) { /* * 二分查找 * 折半查找 */ int arr[] = {1,2,3,4,5,6,7,8,9,10}; int left = 0; int right = arr.length-1; Scanner scanner = new Scanner(System.in); int num = scanner.nextInt(); int flag = 0; while (left<=right) { int mid = (left+right)/2; if (mid==num) { flag = mid; break; } else if (mid>num) { right = mid -1; } else { left=mid+1; } } if (flag == 0) { System.out.println("没找到"); } else { System.out.println("找到了,下标是:" + flag); } } }