普通遍历法
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int i = 0 ;//变量i是下标
int sz = sizeof(arr) / sizeof(arr[0]); //计算元素个数
for (i = 0; i < sz; i++)
{
if (k == arr[i])
{
printf("找到了,下标是:%d\n", i);//i=6
break;
}
}
if (i == sz)
printf("找不到\n");
return 0;
}
二分法
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; 左右两端逐渐向中间靠拢,直到找到最中间的数mid,就是要找的数
if (arr[mid] > k) 易错点: mid是下标,而k是代表元素,下标不能直接跟元素比,所以要用arr[mid]为mid代表的元素跟k比
{
right = mid - 1; //如果中间那个数大于我们要找的那个数,那么我们就让中间数字的下标减去1,作为最右边的下标这样我们就消掉了本身中间数字右边的所有数字
}
else if (arr[mid] < k)
{
left = mid + 1; //如果中间那个数小于我们要找的那个数,那么我们就让中间数字的下标加上1,作为最左边的下标,这样我们就消掉了本身中间数字左边的所有数字
}
else
{
printf("找到了,下标是:%d\n", mid);
break;
}
}
if (left > right) //left > right就意味着左右两边都交错了,找不到了
{
printf("找不到");
}
return 0;
}