1 题目
功能:二分查找 描述: 使用二分查找特定关键字元素 用户输入有序数组的关键字后,给定要查找的关键字,看是否存在于有序数组中
2 思路
二分査找就是折半查找 其基本思想:首先选取表中间位置的记录,将其关键字与给定关键字key进行比较,若相等,则査找成功; 若key值比该关键字值大,则要找的元素一定在右子表中,则继续对右子表进行折半査找; 若key值比该关键字值小,则要找的元素一定在左子表中,继续对左子表进行折半査找; 按照上述递推,直到查找成功或查找失败。
3 代码
#include <stdio.h>
#include <stdlib.h>
/**
功能:二分查找
描述:
使用二分查找特定关键字元素
用户输入有序数组的关键字后,给定要查找的关键字,看是否存在于有序数组中
**/
void binary_search(int key, int a[], int n) { // 自定义函数binary_search
int low, high, mid, count = 0, count1 = 0;
low = 0;
high = n - 1;
while (low < high) { // 当查找范围不为0时执行循环体语句
count++; // count记录查找次数
mid = (low + high) / 2; // 求出中间位置
if (key < a[mid]) // 当key小于中间值
high = mid - 1; // 确定左子表范围
else if (key > a[mid]) // 当key大于中间值
low = mid + 1; // 确定右子表范围
else if (key == a[mid]) { // 当key等于中间值证明查找成功
printf("查找成功!\n查找 %d 次!a[%d]=%d", count, mid, key);
// 输出查找次数及所查找元素在数组中的位置
count1++; // count1记录查找成功次数
break;
}
}
if (count1 == 0) // 判断是否查找失败
printf("查找失败!"); // 查找失败输出no found
}
int main(int argc, char const *argv[]) {
int i, key, a[100], n;
printf("请输入数组的长度:\n");
scanf("%d", &n); // 输入数组元素个数
printf("请输入数组元素:\n");
for (i = 0; i < n; i++)
scanf("%d", &a[i]); // 输入有序数列到数组a中
printf("请输入你想查找的元素:\n");
scanf("%d", &key); // 输入要查找的关键字
binary_search(key, a, n); // 调用自定义函数
printf("\n");
}
示例结果:
$ gcc ex064.c -o demo
$ ./demo
请输入数组的长度:
10
请输入数组元素:
1
4
6
9
12
46
78
90
102
122
请输入你想查找的元素:
102
查找成功!
查找 3 次!a[8]=102