简述:
以下是二分法查找的简要步骤:
-
初始化边界:设定数组的左右边界,左边界为数组的起始索引(通常为 0),右边界为数组的结束索引(通常为数组长度减 1)。
-
计算中间位置:在每次查找中,计算当前搜索范围的中间位置(
mid = (left + right) // 2
)。 -
比较目标值:
-
如果目标值等于中间位置的值,则查找成功,返回中间位置的索引。
-
如果目标值小于中间位置的值,则调整右边界为
mid - 1
,继续在左半部分查找。 -
如果目标值大于中间位置的值,则调整左边界为
mid + 1
,继续在右半部分查找。
-
-
重复步骤 2 和 3:直到找到目标值或搜索范围为空(即左边界大于右边界),此时查找失败,返回 -1 或其他表示未找到的标志。
#include <stdio.h> // 全局变量声明 int a[] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 }; // 已排序的数组 int key; // 要查找的关键字 // 二分查找函数 int binsearch(int left, int right) { if (left <= right) { int mid = (left + right) / 2; if (a[mid] == key) return mid; if (key < a[mid]) return binsearch(left, mid - 1); if (key > a[mid]) return binsearch(mid + 1, right); } return -1; // 未找到返回-1 } // 打印数组函数 void printArray(int a[], int size) { printf("数组内容: "); for (int i = 0; i < size; i++) { printf("%d ", a[i]); } printf("\n"); } int main() { int size = sizeof(a) / sizeof(a[0]); // 打印数组 printArray(a, size); while (1) { printf("\n请输入要查找的数字(输入-1退出): "); scanf_s("%d", &key); if (key == -1) { printf("程序退出\n"); break; } // 调用二分查找函数 int result = binsearch(0, size - 1); // 输出查找结果 if (result != -1) { printf("找到数字 %d,位置在索引 %d\n", key, result); } else { printf("未找到数字 %d\n", key); } } return 0; }
运行结果: