如题:
在一个有序数组中查找具体的某个数字n
例如:在1 2 3 4 5 6 7 8 9 10中找7
代码思路:使用二分法 1.先找中间元素——将左边元素的下标和右边元素的下标相加除2得到的商就是中间元素的下标,找到中间下标所对应的中间元素
2.将中间元素和要找的元素比较,若要找的元素大于中间元素,说明目标元素在中间元素的右边,反之在左边
3.再找到右边(或左边)的中间元素,在和要查找的元素进行比较,大于中间元素在右面,小于在左面
重复以上步骤,直到中间元素和要找的元素相等
二分法查找次数最多是,如有2^32个数字,查找元素时最多查32次
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int k = 7;
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;//左下标不变,右下标中间元素下标-1
}
else if (arr[mid] < k)
{
left = mid + 1;//右下标不变,左下标是中间下标+1
}
else
{
printf("找到了,下标是%d\n", mid);
break;
}
}
if (left>right)//如果找不到元素,左右下标会交错
printf("找不到了\n");
return 0;
}
用函数的方法实现二分查找:
int binary_search(int a[], int k, int s)//传数组,用数组接收
{
int left = 0;
int right = s - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (a[mid] > k)
{
right = mid - 1;
}
else if (a[mid] < k)
{
left = mid + 1;
}
else
{
return mid;
}
}
if (left>right)
{
return -1;
}
}
int main()
{
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int i = 0;
int k = 7;
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = binary_search(arr, k, sz);//在有sz个元素的数组arr中找到k
//找到返回就返回找到位置的下标,找不到就返回-1,因为-1不可能是元素的下标
if (ret == -1)
{
printf("找不到\n");
}
else
{
printf("找到了,下标是%d\n",ret);
}
return 0;
}