mirror of
https://github.com/oxyanyano/2022-WangDao-CS-DS-Notes.git
synced 2026-02-02 18:29:00 +08:00
65 lines
2.1 KiB
Markdown
65 lines
2.1 KiB
Markdown
## 折半查找——Binary Search
|
||
|
||
### 一、折半查找的定义
|
||
|
||
`折半查找`,又叫`二分查找`。仅适用于`有序的顺序表`。
|
||
|
||
### 二、折半查找的实现
|
||
|
||
`算法思想`:每次从中间分,判断自己是哪一半
|
||
|
||
普通代码:
|
||
|
||
```c
|
||
//查找表的数据结构(动态分配的顺序表)
|
||
typedef struct{
|
||
ElemType *elem; //指向“动态”分配的数组的指针
|
||
int TableLen; //查找表的当前长度
|
||
}SSTable;
|
||
//折半查找
|
||
int Binary_Search(SSTable L, ElemType key){
|
||
int low =0, high = L.TableLen-1, mid;
|
||
while(low <= high){
|
||
mid = (low + high)/2; //取中间值
|
||
if(L.elem[mid] == key){
|
||
return mid; //查找成功,则返回所在位置
|
||
}else if(L.elem[mid] > key){
|
||
high = mid - 1; //从前半部分继续查
|
||
}else{
|
||
low = mid + 1; //从后半部分继续查
|
||
}
|
||
}
|
||
return -1; //查找失败,返回-1
|
||
}
|
||
```
|
||
|
||
### 三、查找效率分析
|
||
|
||

|
||
|
||
### 四、折半查找判定树的构造
|
||
|
||
#### 构造:
|
||
|
||

|
||
|
||

|
||
|
||

|
||
|
||
#### 特性:
|
||
|
||

|
||
|
||
查找表有n个关键字,则失败结点有n+1个
|
||
|
||

|
||
|
||
与`折半查找判定树`的高度h有关。高度越小,查找效率越高
|
||
|
||
最好情况,平均查找长度=$$O(log_2n)$$
|
||
|
||
最坏情况,平均查找长度=$$O(n)$$
|
||
|
||
则`时间复杂度`=$$O(log_2n)$$
|