Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

z

二分法

二分法(Binary Search)是一种在有序数据集合中查找特定元素的查找算法。它的思想是通过将搜索范围逐渐缩小一半,从而快速定位目标元素。

基本的二分法算法步骤如下:

  1. 初始化:确定搜索范围的左边界(通常是数组的起始位置)和右边界(通常是数组的末尾位置)。
  2. 循环:在每一轮中,计算搜索范围的中间位置,并与目标元素进行比较。
    • 如果中间元素等于目标元素,那么就找到了目标元素,返回其位置。
    • 如果中间元素小于目标元素,说明目标元素可能在中间位置的右侧,那么将搜索范围缩小为右半部分,更新左边界为中间位置的下一个位置。
    • 如果中间元素大于目标元素,说明目标元素可能在中间位置的左侧,那么将搜索范围缩小为左半部分,更新右边界为中间位置的前一个位置。
  3. 重复:重复步骤 2 直到左边界大于右边界,表示搜索范围为空,此时目标元素不存在于数组中。

注意:二分法在大型有序数组中查找元素非常高效。但是需要注意,二分法要求数据集合是有序的,否则它无法正常工作

题目

本题要求实现二分查找算法。

函数接口定义:

1
Position BinarySearch( List L, ElementType X );

其中List结构定义如下:

1
2
3
4
5
6
typedef int Position;
typedef struct LNode *List;
struct LNode {
ElementType Data[MAXSIZE];
Position Last; /* 保存线性表中最后一个元素的位置 */
};

L是用户传入的一个线性表,其中ElementType元素可以通过>、==、<进行比较,并且题目保证传入的数据是递增有序的。函数BinarySearch要查找XData中的位置,即数组下标(注意:元素从下标1开始存储)。找到则返回下标,否则返回一个特殊的失败标记NotFound

裁判测试程序样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 10
#define NotFound 0
typedef int ElementType;

typedef int Position;
typedef struct LNode *List;
struct LNode {
ElementType Data[MAXSIZE];
Position Last; /* 保存线性表中最后一个元素的位置 */
};

List ReadInput(); /* 裁判实现,细节不表。元素从下标1开始存储 */
Position BinarySearch( List L, ElementType X );

int main()
{
List L;
ElementType X;
Position P;

L = ReadInput();
scanf("%d", &X);
P = BinarySearch( L, X );
printf("%d\n", P);

return 0;
}

/* 你的代码将被嵌在这里 */

输入样例1:

1
2
3
5
12 31 55 89 101
31

输出样例1:

1
2

输入样例2:

1
2
3
3
26 78 233
31

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Position BinarySearch(List L, ElementType X) {
Position left = 1; // 搜索范围的左边界(初始为数组第一个元素的位置)
Position right = L->Last; // 搜索范围的右边界(初始为数组最后一个元素的位置)

while (left <= right) {
Position mid = (left + right) / 2; // 计算当前搜索范围内的中间位置

if (L->Data[mid] == X) {
return mid; // 找到目标元素,返回中间位置
} else if (L-> Data[mid] < X) {
left = mid + 1; // 目标元素可能在中间位置的右侧,调整左边界
} else {
right = mid - 1; // 目标元素可能在中间位置的左侧,调整右边界
}
}

return NotFound; // 目标元素不存在于数组中
}

评论