【算法】(C语言):二分查找

二分查找:

  1. 获取查找区域的中间位置。
  2. 若中间位置的数据就是要找的值,则返回true。若要找的值 小于 中间位置的数据,则往左边查找。若要找的值 大于 中间位置的数据,则往右边查找。
  3. 重复1和2,若没有要找的值,则返回false。

注:二分查找的要求:数据有序(即已排好序)。

时间复杂度:最好情况 O(1),最坏情况 O(logn),平均情况 O(logn)

  • 每次找中间位置,每次查找范围减半,查找次数最多logn,因此总时间约 O(logn)。
  • 最好情况,是第一个中间位置就是要找的值,时间O(1)。

空间复杂度:【迭代】O(1),【递归】 O(logn)

  • 【迭代】只重复使用存储中间位置数据的空间,不随数据量变动而变动,因此空间使用是常量O(1)。
  • 【递归】需使用栈存储递归时的中间位置数据,最多查找次数logn,空间使用约 O(logn) 。

C代码实现:

【迭代】

cpp 复制代码
int search(int *array, int length, int data)			// binary search
{
    // 起始索引,结束索引,中间位置索引
	int start = 0, end = length - 1;
	int midindex = start + ceil((end - start ) / 2);
    // 索引号越界,退出循环
	while(midindex >= 0 && midindex <= end)
	{   
        // 找到匹配的值,返回1(true)
		if(array[midindex] == data) return 1;
        // 找的值比中间值小,往左边找,结束索引为中间位置前一位
		if(array[midindex] > data) end = midindex - 1;
        //  找的值比中间值大,往右边找,开始索引为中间位置后一位
		else start = midindex + 1;
        // 循环找下一个中间位置
		midindex = start + ceil((end - start ) / 2);
	}
    // 没找到,返回0(false)
	return 0;
}

【递归】

cpp 复制代码
int search2(int *array, int start, int end, int data)		// binary search (recursion)
{
    // 获取中间位置索引
	int midindex = start + ceil((end - start ) / 2);
    // 索引号越界,即没找到,返回0(false)
	if(midindex < 0 || midindex > end) return 0;
    // 找到值,返回1(true)
	if(array[midindex] == data) return 1;
    // 要找的值 比中间值小,往左边递归查找
	if(array[midindex] > data) search2(array, 0, midindex - 1, data);
    // 要找的值 比中间值大,往右边递归查找
	else search2(array, midindex + 1, end, data);
}

完整代码:(binarysearch**.**c)

cpp 复制代码
#include <stdio.h>
#include <math.h>

int search(int *, int, int);				// binary search
int search2(int *, int, int, int);			// binary search (recursion)
void traverse(int *, int);				    // show element one by one	

int main(void)
{
	int arr[] = {1,2,3,5,6,8,9};
	int n = sizeof(arr) / sizeof(int);
	traverse(arr, n);	

	printf("[no recursion] find '8' (1:true, 0:false): %d\n", search(arr, n, 8));
	printf("[  recursion ] find '8' (1:true, 0:false): %d\n", search2(arr, 0, n, 8));
	printf("[no recursion] find '4' (1:true, 0:false): %d\n", search(arr, n, 4));
	printf("[  recursion ] find '4' (1:true, 0:false): %d\n", search2(arr, 0, n, 4));
	return 0;
}

int search(int *array, int length, int data)			// binary search
{
	int start = 0, end = length - 1;
	int midindex = start + ceil((end - start ) / 2);
	while(midindex >= 0 && midindex <= end)
	{
		if(array[midindex] == data) return 1;
		if(array[midindex] > data) end = midindex - 1;
		else start = midindex + 1;
		midindex = start + ceil((end - start ) / 2);
	}
	return 0;
}

int search2(int *array, int start, int end, int data)		// binary search (recursion)
{
	int midindex = start + ceil((end - start ) / 2);
	if(midindex < 0 || midindex > end) return 0;
	if(array[midindex] == data) return 1;
	if(array[midindex] > data) search2(array, 0, midindex - 1, data);
	else search2(array, midindex + 1, end, data);
}

void traverse(int *array, int length)				// show element one by one	
{
	printf("elements(%d): ", length);
	for(int k = 0; k < length; k++)
	{
		printf("%d  ", array[k]);
	}
	printf("\n");
}

编译链接: gcc -o binarysearch binarysearch**.**c

执行可执行文件: ./binarysearch

相关推荐
可涵不会debug几秒前
C语言文件操作:标准库与系统调用实践
linux·服务器·c语言·开发语言·c++
凭君语未可4 分钟前
豆包MarsCode:小C点菜问题
算法
C语言魔术师23 分钟前
【小游戏篇】三子棋游戏
前端·算法·游戏
自由自在的小Bird24 分钟前
简单排序算法
数据结构·算法·排序算法
利刃大大2 小时前
【Linux入门】2w字详解yum、vim、gcc/g++、gdb、makefile以及进度条小程序
linux·c语言·vim·makefile·gdb·gcc
我想学LINUX3 小时前
【2024年华为OD机试】 (A卷,100分)- 微服务的集成测试(JavaScript&Java & Python&C/C++)
java·c语言·javascript·python·华为od·微服务·集成测试
雁于飞3 小时前
c语言贪吃蛇(极简版,基本能玩)
c语言·开发语言·笔记·学习·其他·课程设计·大作业
王老师青少年编程7 小时前
gesp(C++五级)(14)洛谷:B4071:[GESP202412 五级] 武器强化
开发语言·c++·算法·gesp·csp·信奥赛
DogDaoDao7 小时前
leetcode 面试经典 150 题:有效的括号
c++·算法·leetcode·面试··stack·有效的括号
Coovally AI模型快速验证8 小时前
MMYOLO:打破单一模式限制,多模态目标检测的革命性突破!
人工智能·算法·yolo·目标检测·机器学习·计算机视觉·目标跟踪