折半查找:当数组元素有序时,利用折半查找,时间复杂度为O(logN)。利用双指针,一个指向起点(left),一个指向终点(right)。定义mid等于(left+right)/2,向下取整(也可以向上,算法实现是一样的,但是做成二叉树的时候不一样,注意区分)。若mid的值等于要查找的值key则直接返回mid,若mid的值小于key则left=mid+1,否则right=mid-1。一直重复上面操作,直至找到目标。
算法实现如下:
#include <stdio.h>
typedef struct{
int nums[20];
int length;
}Nums,*PNums;
int search(PNums,int);
int main(){
Nums numbers = {{0},0};
printf("请输入数字,不超过20个,输入-1表示结束:\n");
int temp = 0,key = -1;
while(1){
scanf("%d",&temp);
if(temp == -1||numbers.length == 20){
break;
}
numbers.nums[numbers.length++] = temp;
}//这里的输入大家可以换成自己的测试用例
printf("请输入需要查找的数字:");
scanf("%d",&key);
int result = search(&numbers,key);
if(result != -1){
printf("查找的元素在数组中存在,位于第%d位\n",result+1);
}else{
printf("输入的元素不存在\n");
}
}
int search(PNums numbers,int key){
int index = -1;
int left = 0,right = numbers->length-1,mid = 0;
int count = 0;//记录比较次数
while(left<=right){
count++;
mid = (int)((left+right)/2);
if(key == numbers->nums[mid]){
index = mid;
break;
}else if(key < numbers->nums[mid]){
right = mid -1;
}else{
left = mid +1;
}
}
printf("一共进行了%d次比较\n",count);
return index;
}
如有bug,请各位大佬批评指正~~~
感谢观看
&spm=1001.2101.3001.5002&articleId=132390486&d=1&t=3&u=fe41d1f1e5b54dc4a59b2d144137ddaf)
4300

被折叠的 条评论
为什么被折叠?



