折半查找法(二分查找法)是一种在有序数组中查找特定元素的高效算法,其基本思想是将数组分成两部分,通过比较待查元素与中间元素的大小,缩小查找范围,直到找到目标元素或确定目标元素不存在。以下是不同实现方式的代码示例:
### 简单数组实现
```c
#include <stdio.h>
// 折半查找法
int zheban(int a[], int n, int m) {
int low = 0;
int high = n - 1;
int mid;
while (low <= high) {
mid = (low + high) / 2;
if (a[mid] == m)
return mid; // 找到,返回下标
else if (a[mid] < m)
low = mid + 1;
else
high = mid - 1;
}
return -1; // 没有找到,返回 -1
}
int main() {
int n;
scanf("%d", &n);
int a[n]; // 输入 n 个有序的数
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
int m; // 输入要查找的数
scanf("%d", &m);
int k = zheban(a, n, m);
if (k == -1)
printf("没有找到");
else
printf("%d", k);
return 0;
}
```
此代码定义了`zheban`函数来实现折半查找,在`main`函数中读取有序数组和待查整数,调用`zheban`函数进行查找并输出结果[^1]。
### 结构体实现
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int *elem;
int length;
} SqList;
int ZheBan(SqList s, SqList *s1, int k) {
int low = 0, high = s.length - 1;
int mid;
s1->length = 0;
while (low <= high) {
mid = (low + high) / 2;
s1->elem[s1->length++] = s.elem[mid];
if (s.elem[mid] < k)
low = mid + 1;
else if (s.elem[mid] > k)
high = mid - 1;
else
return mid;
}
return -1;
}
int main() {
SqList s, s1;
int k;
scanf("%d", &s.length);
s.elem = (int *)malloc(100 * sizeof(int));
s1.elem = (int *)malloc(100 * sizeof(int));
for (int i = 0; i < s.length; i++) {
scanf("%d", &s.elem[i]);
getchar();
}
scanf("%d", &k);
if (ZheBan(s, &s1, k) != -1)
printf("%d\n", ZheBan(s, &s1, k));
else
printf("no\n");
for (int i = 0; i < s1.length - 1; i++)
printf("%d,", s1.elem[i]);
printf("%d", s1.elem[s1.length - 1]);
return 0;
}
```
该代码使用结构体`SqList`来表示数组,`ZheBan`函数实现折半查找,`main`函数负责读取输入、调用查找函数并输出结果和查找过程中访问的元素[^2]。
### 固定数组长度实现
```c
#include <stdio.h>
int main() {
int mid, da = 14, xiao = 0, i, x;
int a[15];
for (i = 0; i < 15; i++) {
scanf("%d", &a[i]);
}
scanf("%d", &x);
mid = (da + xiao) / 2;
while (a[mid] != x) {
if (x < a[mid]) {
da = mid - 1;
mid = (da + xiao) / 2;
}
if (x > a[mid]) {
xiao = mid + 1;
mid = (da + xiao) / 2;
}
if (xiao > da)
break;
}
if (a[mid] == x) {
printf("%d\n", mid);
} else
printf("NO\n");
return 0;
}
```
此代码针对长度为 15 的固定数组,在`main`函数中直接实现折半查找逻辑,读取数组和待查整数,输出查找结果[^3]。
### 另一种简单数组实现
```c
#include <stdio.h>
#include <Windows.h>
int main() {
int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int mid = 0;
int left = 0;
int right = sizeof arr / sizeof arr[0] - 1;
int key = 7;
while (left <= right) {
mid = left + (right - left) / 2; // 计算中间下标(防止溢出)
if (arr[mid] < key) {
left = mid + 1;
} else if (arr[mid] > key) {
right = mid - 1;
} else {
printf("找到了:%d\n", mid);
break; // 找到了返回下标
}
}
if (left > right)
printf("-1\n"); // 找不到返回 -1
system("pause");
return 0;
}
```
该代码在`main`函数中对固定数组进行折半查找,查找目标为`key`,输出查找结果[^4]。