2023-06-29 C语言实现快速二分查找法,用二分法查找在哪个区间范围。
1、chatGPT 给出的二分查找函数。
·
一、先来看快速二分查找实例
1、chatGPT 给出的二分查找函数。
int binarySearch(int arr[], int left, int right, int target) {
while (left <= right) {
int mid = left + (right - left) / 2;
printf("start:left = %d , right = %d, mid = %d \n", left , right , mid);
// 如果目标元素在中间
if (arr[mid] == target) {
return mid;
}
// 如果目标元素比中间元素小,继续在左侧搜索
if (arr[mid] > target) {
right = mid - 1;
}
// 如果目标元素比中间元素大,继续在右侧搜索
else {
left = mid + 1;
}
printf("end:left = %d , right = %d, mid = %d \n", left , right , mid);
}
// 若未找到目标元素
return -1;
}
2、测试代码
#include <stdio.h>
int binarySearch(int arr[], int left, int right, int target) {
while (left <= right) {
int mid = left + (right - left) / 2;
printf("start:left = %d , right = %d, mid = %d \n", left , right , mid);
// 如果目标元素在中间
if (arr[mid] == target) {
return mid;
}
// 如果目标元素比中间元素小,继续在左侧搜索
if (arr[mid] > target) {
right = mid - 1;
}
// 如果目标元素比中间元素大,继续在右侧搜索
else {
left = mid + 1;
}
printf("end:left = %d , right = %d, mid = %d \n", left , right , mid);
}
// 若未找到目标元素
return -1;
}
int main() {
int arr[] = {2, 5, 8, 12, 16, 23, 38, 56, 72, 91};
int n = sizeof(arr) / sizeof(arr[0]);
int target = 2;
int index = binarySearch(arr, 0, n - 1, target);
if (index != -1) {
printf("目标元素 %d 在数组中的索引为 %d\n", target, index);
} else {
printf("目标元素 %d 未在数组中找到\n", target);
}
target = 72;
index = binarySearch(arr, 0, n - 1, target);
if (index != -1) {
printf("目标元素 %d 在数组中的索引为 %d\n", target, index);
} else {
printf("目标元素 %d 未在数组中找到\n", target);
}
target = 9;
index = binarySearch(arr, 0, n - 1, target);
if (index != -1) {
printf("目标元素 %d 在数组中的索引为 %d\n", target, index);
} else {
printf("目标元素 %d 未在数组中找到\n", target);
}
return 0;
}
3、运行结果
start:left = 0 , right = 9, mid = 4
end:left = 0 , right = 3, mid = 4
start:left = 0 , right = 3, mid = 1
end:left = 0 , right = 0, mid = 1
start:left = 0 , right = 0, mid = 0
目标元素 2 在数组中的索引为 0
start:left = 0 , right = 9, mid = 4
end:left = 5 , right = 9, mid = 4
start:left = 5 , right = 9, mid = 7
end:left = 8 , right = 9, mid = 7
start:left = 8 , right = 9, mid = 8
目标元素 72 在数组中的索引为 8
start:left = 0 , right = 9, mid = 4
end:left = 0 , right = 3, mid = 4
start:left = 0 , right = 3, mid = 1
end:left = 2 , right = 3, mid = 1
start:left = 2 , right = 3, mid = 2
end:left = 3 , right = 3, mid = 2
start:left = 3 , right = 3, mid = 3
end:left = 3 , right = 2, mid = 3
目标元素 9 未在数组中找到
二、如果没有匹配的值,用快速二分查找返回区间,稍微改一下,返回left就可以。
#include <stdio.h>
int binarySearch(int arr[], int left, int right, int target) {
while (left <= right) {
int mid = left + (right - left) / 2;
printf("start:left = %d , right = %d, mid = %d \n", left , right , mid);
// 如果目标元素在中间
if (arr[mid] == target) {
return mid;
}
// 如果目标元素比中间元素小,继续在左侧搜索
if (arr[mid] > target) {
right = mid - 1;
}
// 如果目标元素比中间元素大,继续在右侧搜索
else {
left = mid + 1;
}
printf("end:left = %d , right = %d, mid = %d \n", left , right , mid);
}
// 若未找到目标元素,返回
return left;
}
int main() {
int arr[] = {2, 5, 8, 12, 23, 38, 56, 72, 91};
int n = sizeof(arr) / sizeof(arr[0]);
printf("total items : %d\n", n);
int target =100;
int index = binarySearch(arr, 0, n - 1, target);
printf("目标元素 %d 在数组中的索引为 %d 的前面\n", target, index);
target = 1;
index = binarySearch(arr, 0, n - 1, target);
printf("目标元素 %d 在数组中的索引为 %d 的前面\n", target, index);
target = 9;
index = binarySearch(arr, 0, n - 1, target);
printf("目标元素 %d 在数组中的索引为 %d 的前面\n", target, index);
return 0;
}
total items : 9
start:left = 0 , right = 8, mid = 4
end:left = 5 , right = 8, mid = 4
start:left = 5 , right = 8, mid = 6
end:left = 7 , right = 8, mid = 6
start:left = 7 , right = 8, mid = 7
end:left = 8 , right = 8, mid = 7
start:left = 8 , right = 8, mid = 8
end:left = 9 , right = 8, mid = 8
目标元素 100 在数组中的索引为 9 的前面
start:left = 0 , right = 8, mid = 4
end:left = 0 , right = 3, mid = 4
start:left = 0 , right = 3, mid = 1
end:left = 0 , right = 0, mid = 1
start:left = 0 , right = 0, mid = 0
end:left = 0 , right = -1, mid = 0
目标元素 1 在数组中的索引为 0 的前面
start:left = 0 , right = 8, mid = 4
end:left = 0 , right = 3, mid = 4
start:left = 0 , right = 3, mid = 1
end:left = 2 , right = 3, mid = 1
start:left = 2 , right = 3, mid = 2
end:left = 3 , right = 3, mid = 2
start:left = 3 , right = 3, mid = 3
end:left = 3 , right = 2, mid = 3
目标元素 9 在数组中的索引为 3 的前面
四、参考文章
二分法及其注意事项(查找数字,区间,快速幂)(C语言)_二分法后跟区间_RainbowsixPlayer的博客-CSDN博客

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)