二分查找
来源:互联网 发布:承接淘宝服装代加工 编辑:程序博客网 时间:2024/06/07 12:24
一直以为二分查找很简单,,但是真写的时候半个小时都没写对。
- 二分查找的时间复杂度是O(log(n)),最坏情况下的时间复杂度是O(n)。
- 二分查找的一个条件是待查询的数组是有序的,我们假设这里的数组是升序的。
- 二分查找的主要思路就是设定两个指针start和end分别指向数组元素的收尾两端,然后比较数组中间结点arry[mid]和待查找元素。如果待查找元素小于中间元素,那么表明带查找元素在数组的前半段,那么将end=mid-1,如果待查找元素大于中间元素,那么表明该元素在数组的后半段,将start=mid+1;如果中间元素等于待查找元素,那么返回mid的值。
二分查找可以使用递归和非递归的方法来解决,下面给出代码实例。
package com.cn.gao;public class BinaySearch { public static void main(String[] args){ int[] arr = {15, 18, 30, 36, 36, 45, 48, 53, 72, 93}; int[] arr1=null; BinaySearch bs = new BinaySearch(); int pos = bs.binarySearch2(arr1,0,arr1.length-1,72); if(pos == -1){ System.out.println("no num"); }else{ System.out.println(pos); } } //递归 public int binarySearch1(int[] arr,int left,int right,int key){ if(arr == null || arr.length == 0) return -1; if(left<right){ if(key<arr[left] || key>arr[right]) return -1; if(key == arr[left]) return left; if(key == arr[right]) return right; int middle = (left + right)/2; if(arr[middle]==key){ return middle; } if(arr[middle]>key){ return binarySearch1(arr,left,middle-1,key); } if(arr[middle]<key){ return binarySearch1(arr,middle+1,right,key); } } return -1; } //非递归 public int binarySearch2(int[] arr,int left,int right,int key){ if(arr == null || arr.length == 0) return -1; while(left<right){ if(key<arr[left] || key>arr[right]) return -1; if(key == arr[left]) return left; if(key == arr[right]) return right; int middle = (left + right)/2; if(arr[middle]==key){ return middle; } if(arr[middle]>key){ right = middle -1; } if(arr[middle]<key){ left = middle + 1; } } return -1; }}
0 0
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- CSS 入门
- ZOJ 3870 - Team Formation(数学)
- Qt 实现的文本编辑器
- MySql的基本语句操作
- DP·数位DP(2)
- 二分查找
- 利用反射技术修改类中的字段(成员变量的反射)
- Linux常用命令大全
- hihoCoder 1038 : 01背包
- 数据挖掘数据集下载搜集整理版
- day 024UITableView
- 深入了解 CSS3 新特性
- B_Dungeon Master(POJ_2251)
- Jsp与Servlet中乱码的解决方法