一、先来看快速二分查找实例

    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博客

Logo

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

更多推荐