二分查找算法(折半查找算法)

一般当我们在一组有序数组中查找某个元素n时,我们可以使用逐个对比查找的方法

例如

#include <stdio.h>

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10};
	int i = 0;
	int k = 6;
	int sz = sizeof(arr) / sizeof(arr[0]);   //计算元素个数
	for (i = 0; i < sz; i++)
	{
		if (k == arr[i])
		{
			printf("该数即为所求,下标为:%d
", i);
			break;
		}
	}
	if (i == sz)
		printf("所给出的数中没有该数
");
	return 0;
}

但是对于这种方法来讲一般比较麻烦,因为对于一个含有n个元素的数组,将会查找n次

因此我们引进二分查找算法来计算

同样的道理,我们在1~10这些数中寻找6

元素 1 2 3 4 5 6 7 8 9 10 下标 0 1 2 3 4 5 6 7 8 9

这样就大大省略了查找时间,才开始的10次查找——>3次

二分查找算法的源代码一般为:

int arr[]={ };  //空里面即为所给的元素
int k=?;    //为所求的数
int sz=sizeof(arr)/sizeof(arr[0]);    //计算元素个数
int left=0;    //左下标
int right=sz-1;    //右下标
while(left<=right)
{
    int mid=(left+right)/2;
    if(arr[mid]>k)
    {
        right=mid-1;
    }
    else if(arr[mid]<k)
    {
        left=mid+1;
    }
    else
    {
        printf("即为所求");
        break;
    }
    if(left>right)
        printf("所给的元素里面没有该数
");
}

下面我们给出具体的题目:在1~10这些有序数里面,寻找6;

思路为

代码展示如下:

#include <stdio.h>

int main() {
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };  //空里面即为所给的元素
    int k = 6;
    int sz = sizeof(arr) / sizeof(arr[0]);    //计算元素个数
    int left = 0;    //左下标
    int right = sz - 1;    //右下标
    while (left <= right)
    {
        int mid = (left + right) / 2;
        if (arr[mid] > k)
        {
            right = mid - 1;
        }
        else if (arr[mid] < k)
        {
            left = mid + 1;
        }
        else
        {
            printf("即为所求的数,下标为:%d
",mid);
            break;
        }
        if (left > right)
        {
            printf("所给的元素里面没有该数
");
        }
    }
}
经验分享 程序员 微信小程序 职场和发展