折半查数法
#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]) - 1 ; //sz是下标最大的值
int left = 0; //这里求得是第一个数的下标
int right = sz; //这里是最大值的下标
//int mid = (left + right) / 2;
while (right >= left) //当右边下标还大于等于左边时循环
{
int mid = (left + right) / 2; //直接求中间的一个值
if (k > arr[mid]) //k大于中间的值说明k在mid的右边 这里要给left赋值=mid+1
{
left = mid +1; //因为中间的值已经小于k了 所以在这里直接+1等于左边在进行比较
}
else if(k < arr[mid]) //k小于中间值说明在mid左边 这里面就要给right赋值mid-1
{
right = mid - 1;
}
else //这里表示当k=mid
{
printf("找到了数是%d\n",arr[mid]);
printf("找到了下标是%d\n",mid);
break;
}
//注意这里面的mid都表示下标
}
if (left > right)
{
printf("没找到\n");
}
return 0;
}
定义函数
#include <stdio.h>
int X_S(int arr[], int k, int sz)
{
int left = 0;
int right = sz;
while (right >= left)
{
int mid = (left + right);
if (k > arr[mid])
//if (k > mid)
{
left = mid + 1;
}
else if(k < arr[mid])
//else if (k < mid)//这种直接求数 但sz不用减1
{
right = mid - 1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int sz = sizeof(arr) / sizeof(arr[0]) - 1;
int R = X_S(arr, k, sz);
if (R == -1)
{
printf("找不到\n");
}
else
{
printf("找到了下标是%d\n",R);
}
return 0;
}