目录
重点:
举例:
int arr[10] = { 0 };
sizeof(arr)整个数组的大小 sizeof(arr[0])第一个元素的大小 sizeof(arr) / sizeof(arr[0])数组元素的个数
数组传参实际上传的是数组首元素的地址,而不是整个数组。在含函数内部计算一个函数参数的数组元素个数是不靠谱的,
int binary_search(int arr[],int k)形参看上去是数组,实际是指针变量。
错误示范:
int binary_search(int arr[], int k) {
int sz = sizeof(arr) / sizeof(arr[0]);// 1/2
4/8 4
int left = 0;
int right = sz - 1;
}
二分查找:
(1)
#include<stdio.h>
int binary_search(int arr[], int k, int sz) {
int left = 0;
int right = sz - 1;
while (left<=right) {
int mid = (left + right) / 2; // int mid = left + (right - left) / 2;
if (arr[mid] < k) {
left = mid + 1;
}
else if (arr[mid] > k) {
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;
//找到了返回下标
// 找不到返回-1
//int sz = sizeof(arr) / sizeof(arr[0]);
// int pos=binary_search(arr, k, sz);
int pos=binary_search(arr, k,10);//在arr的10个元素中找K
if (-1 == pos)
printf("找不到\n");
else
printf("找到了,下标是:%d\n", pos);
return 0;
}
(2)
普通的二分查找
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 - left) / 2;
if (arr[mid] < k) {
left = mid+1;
}
else if (arr[mid] > k) {
right = mid - 1;
}
else {
printf("找到了,下标为%d", mid);
break;
}
}
if (left > right) {
printf("找不到");
}
return 0;
}
普通方法:
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7; //找的元素
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++){
if (arr[i] == k) {
printf("找到了下标是:%d",i);
break;
}
}
if (i == sz) {
printf("找不到");
}
return 0;
}