二分查找
来源:互联网 发布:数据库具备的特性 编辑:程序博客网 时间:2024/06/04 23:18
二分查找:二分查找是很常见而且高效的查找方式,比普通查找速度快的多。普通查找:遍历数组和查询值进行比较; 二分查找:定义中间值和所查找值进行比较,小于中间值就查找中间值左边的值,大于则相反。
所以,二分查找要满足被查的数组是有序排列的。下面代码分别是普通查找,二分查找和递归实现的二分查找。
所以,二分查找要满足被查的数组是有序排列的。下面代码分别是普通查找,二分查找和递归实现的二分查找。
介绍
二分查找,又称折半查找,二分搜索,是一种在有序数组中查找某一特定元素的算法。优点是比较次数少,查找速度快,平均性能好;缺点是要求待查数组有序,且插入删除困难。因此二分查找适合于那些不经常变动而查找频繁的的有序列表。
假设数组中元素是有序的,搜索过程首先从数组的中间开始,如果中间元素刚好是要查找的元素,则搜索过程结束;否则利用中间位置记录的元素将数组分成前后两个字数组,如果某一特定元素大于或者小于中间元素,则在数组中大于或者小于中间元素的那一半查找,也从数组中间元素开始比较,重复以上步骤。
虽然第一篇二分搜索论文在1946年就发表了,但是第一个没有错误的二分搜索程序却直到1962年才出现.
复杂度分析
因为二分搜索算法每一步都使搜索范围缩小一半,所以很明显时间复杂度是O(logn)
代码
二分查找在算法大家庭中属于"分治法",分治法基本都可以使用递归来实现。
递归实现如下:
public class Dichotomy {
/**
* 普通查找和二分查找法
*/
public static void main(String[] args) {
int[] num = { 15, 34, 36, 45, 52, 63 };
Arrays.sort(num);
int n = 45;
// int j = findNum(num,n);
// int j = DichotomybyCommon(num, n);
int j = Dichotomybydigui(num, 0, num.length, n);
System.out.println(j);
}
// 普通查找法
public static int findNum(int[] num, int n) {
for (int i = 0; i < num.length; i++) {
if (num[i] == n)
return i;
}
return 0;
}
// 普通二分查找
@SuppressWarnings("unused")
private static int DichotomybyCommon(int[] num, int n) {
int left, right, among;
left = 0;
right = num.length - 1;
while (left <= right) {
among = (left + right) / 2;
if (num[among] == n)
return among;
else if (n < num[among])
right = among - 1;
else
left = among + 1;
}
return -1;
}
// 递归二分查找
private static int Dichotomybydigui(int[] num, int left, int right,
int keyNum) {
int among = (left + right) / 2;
if (left <= right) {
if (num[among] == keyNum)
return among;
else if (keyNum < num[among])
//使用递归算法自身调用自身
return Dichotomybydigui(num, left, among - 1, keyNum);
else
return Dichotomybydigui(num, among + 1, right, keyNum);
}
return -1;
}
}
0 0
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- Spark配置属性详解(1)
- HDU 5700 区间交 (枚举 + multiset)
- 一个菜的不能再菜的菜鸟第一次写网页
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
- Spark三种属性配置方式详细说明
- 二分查找
- USACO Section 3.3 A Game pascal
- URI和URL区别
- XML
- 自组织神经网络:Kohonen网络训练算法
- SQLite数据库基本语法
- 2151 Worm
- 工具进阶篇
- [leetcode] 【数组】36. Valid Sudoku