看二分查找前,我们先看一下普通的查找,即线性查找。
该算法的时间复杂度为 O(n) ,即线性的。我们能不能把时间复杂度再降低,提高效率呢?显示是可以的。
我们发现,while 每执行一次,我们的查找范围就会缩减一半,也就是说:
最差的情况下,while 执行的次数为 O(logn) 次,循环体内执行一次用时 O(1),所以时间复杂度为 O(logn)。
一、线性查找,时间复杂度 O(n)
- package algorithm;
- public class Search_linear {
- int Search(int [] arr, int x) {
- for(int i=0;i<arr.length;i++) {
- if(arr[i]==x)
- return i;//找到了,返回下标
- }
- return -1;//如果没找到,返回-1
- }
- public static void main(String args[]) {
- int[] arr = {1,2,4,6,8};
- Search_linear s = new Search_linear();
- int x = s.Search(arr,4);
- System.out.println(x); //2
- }
- }
该算法的时间复杂度为 O(n) ,即线性的。我们能不能把时间复杂度再降低,提高效率呢?显示是可以的。
二、二分查找,时间复杂度 O(logn)
- package algorithm;
- public class Search_binary {
- int Search(int[] arr, int x) {
- int left = 0,right = arr.length-1;
- int mid;
- while(left<=right) {
- mid = (left+right)/2;
- if(x>arr[mid])
- left = mid+1;
- else if(x<arr[mid])
- right = mid-1;
- else
- return mid;
- }
- return -1;//没找到,返回-1
- }
- public static void main(String args[]) {
- int[] arr = {1,2,4,6,8};
- Search_binary s = new Search_binary();
- int x = s.Search(arr,4);
- System.out.println(x);//2
- }
- }
我们发现,while 每执行一次,我们的查找范围就会缩减一半,也就是说:
最差的情况下,while 执行的次数为 O(logn) 次,循环体内执行一次用时 O(1),所以时间复杂度为 O(logn)。
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏