1.sizeof()函数:计算数组元素个数
#include"stdio.h"
int main(){
int arr[10]={0};
printf("%d",sizeof(arr));//数组arr所占总字节大小
printf("%d",sizeof(arr[0]));//数组中单个元素所占字节大小
printf("%d",sizeof(arr)/sizeof(arr[0]));//元素个数
return 0;
}
(1)sizeof(arr):计算数组arr占的字节大小,这里arr是一个整型数组,1个int占4个字节故输出40
(2)sizeof(arr[0]):计算单个数组元素占的大小
(3)sizeof(arr)/sizeof(arr[0]):数组总字节大小/单个字节大小=数组元素个数,这个式子表示数组元素个数。
2.算法思想:
二分查找是一种常见的查找算法,它的基本思想是将有序数组分成两部分,取中间值与目标值进行比较,如果相等则返回,如果中间值大于目标值,则在左半部分继续查找,否则在右半部分继续查找,直到找到目标值或者数组被遍历完。
二分查找的时间复杂度为 O(log n),比线性查找的时间复杂度 O(n) 要快得多,但是它要求数组必须是有序的。
一句话总结:把串数分为左右两部分,左边小右边大,取中间值和目标值对比,如果中间大于目标,就说明目标值比中间值小,应该在左边部分查找,反之在右边部分继续查找。
3.代码实现:
#include"stdio.h"
#include"string.h"
int main(){
int arr[10]={1,2,3,4,5,6,7,8,9};//定义一个升序数组
int i=0;//表示第一个元素下标
int j=sizeof(arr)/sizeof(arr[0])-1;//最后一个元素的下标
int key=7;//目标数
int k=0;//记录数组中间值的下标
int f=0;
while(i<=j){
k=(i+j)/2;//中间下标
//如果中间值大于目标值,到中间值的左边查找
if(arr[k]>key){
j=k-1;//查找的最后一个元素下标变成中间值的前一个元素
}
//如果中间值小于目标值,到中间值的左边查找
else if(arr[k]<key){
i=k+1;//查找的最后一个元素下标变成中间值的后一个元素
}
//找到了
else{
f=1;//令查找数为1
break;
}
}
if(f==1){
printf("找到了!下标是%d\n",k);
}
else{
printf("没有该元素!");
}
return 0;
}