Skip to content

Commit f2dfb54

Browse files
author
haiji.yang
committed
add BinarySearch 🆕 📖
1 parent bbf4495 commit f2dfb54

File tree

3 files changed

+122
-0
lines changed

3 files changed

+122
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
## 二分查找算法
2+
3+
### 介绍
4+
5+
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
6+
7+
### 查找过程
8+
9+
先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
10+
11+
### 算法要求
12+
13+
1.必须采用顺序存储结构。
14+
2.必须按关键字大小有序排列。
15+
16+
### 比较次数
17+
18+
计算公式:
19+
20+
![BinarySearch01](img/BinarySearch01.png)
21+
22+
当顺序表有n个关键字时:
23+
查找失败时,至少比较a次关键字;查找成功时,最多比较关键字次数是b。
24+
注意:a,b,n均为正整数。
25+
26+
其时间复杂度可以表示O(log2n)
27+
28+
### 示例
29+
```java
30+
public class BinarySearch {
31+
public static void main(String[] args) {
32+
int[] array = {1, 8, 10, 89, 1000, 1234};
33+
int i = binarySearch(array, 0, array.length, 1000);
34+
System.out.printf("array [%d] = %d",i,array[i]);
35+
}
36+
37+
/**
38+
* 二分查找
39+
*
40+
* @param array 原数组
41+
* @param start 开始下标
42+
* @param end 结束下标
43+
* @param key 需要查找的数值
44+
*/
45+
private static int binarySearch(int[] array, int start, int end, int key) {
46+
// 去一半
47+
int num = (end + start) / 2;
48+
// 表示找到
49+
if (key == array[num]) {
50+
return num;
51+
}
52+
if (start >= end) {
53+
return -1;
54+
}
55+
// 如果要查找的数据 > array[num] , 说明 key 在num的右侧
56+
// 所以需要将 num + 1 ,而结束位置不动
57+
else if (key > array[num]) {
58+
return binarySearch(array, num + 1, end, key);
59+
}
60+
// 如果要查找的数据 < array[num] , 说明 key 在num的左侧
61+
// 所以需要将查找的范围缩小到 num -1 的位置,起始位置不变
62+
else if (key < array[num]) {
63+
return binarySearch(array, start, num - 1, key);
64+
}
65+
return -1;
66+
}
67+
}
68+
```
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.javayh.advanced.java.algorithm.search;
2+
3+
/**
4+
* <p>
5+
* 二分查找算法
6+
* </p>
7+
*
8+
* @author Dylan
9+
* @version 1.0.0
10+
* @since 2020-12-28 8:21 PM
11+
*/
12+
public class BinarySearch {
13+
public static void main(String[] args) {
14+
int[] array = {1, 8, 10, 89, 1000, 1234};
15+
int i = binarySearch(array, 0, array.length, 1000);
16+
if(i > 0){
17+
System.out.printf("array [%d] = %d",i,array[i]);
18+
}else {
19+
System.out.println("未找到目标数据");
20+
}
21+
22+
}
23+
24+
/**
25+
* 二分查找
26+
*
27+
* @param array 原数组
28+
* @param start 开始下标
29+
* @param end 结束下标
30+
* @param key 需要查找的数值
31+
*/
32+
private static int binarySearch(int[] array, int start, int end, int key) {
33+
// 去一半
34+
int num = (end + start) / 2;
35+
// 表示找到
36+
if (key == array[num]) {
37+
return num;
38+
}
39+
if (start >= end) {
40+
return -1;
41+
}
42+
// 如果要查找的数据 > array[num] , 说明 key 在num的右侧
43+
// 所以需要将 num + 1 ,而结束位置不动
44+
else if (key > array[num]) {
45+
return binarySearch(array, num + 1, end, key);
46+
}
47+
// 如果要查找的数据 < array[num] , 说明 key 在num的左侧
48+
// 所以需要将查找的范围缩小到 num -1 的位置,起始位置不变
49+
else if (key < array[num]) {
50+
return binarySearch(array, start, num - 1, key);
51+
}
52+
return -1;
53+
}
54+
}

0 commit comments

Comments
 (0)