下面是用二分法查找的代码,,也叫折半查找,它是一种效率较高的查找方法。要值得注意的是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。查找次数为log2n,n为元素个数。
原理:先设定两个坐标,并且求出两个坐标中间的坐标(左右相加除以二),如果要找的那个数比中间坐标小(要找的数在中间坐标的左边),那么我们想,应该去左边去找那个数,于是将右坐标赋值/定义为中间坐标的位置再向左一位(就是右坐标=中间坐标-1),然后再来计算出中间坐标,再拿中间坐标和要找的数比,如果比中间坐标大(要找的数在中间坐标的右边),那么我们就应该去右边来找那个数,于是将左坐标赋值/定义为中间坐标的位置再向右一位(就是左坐标=中间坐标+1),再来计算中建坐标。
这样反复进行(循环),直到中间坐标的数=要找的数;而如果找不到也会跳出循环。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int main()
{
int x = 0;
printf(“输入想要找的数”);
scanf("%d", &x);
int i = 0;
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]) - 1; //算出数组长度,-1是因为第一个数组元素下标是0
int mid = (right - left) / 2 + left;
while(left <= right)
{
mid = (right - left) / 2 + left;
if (arr[mid] > x)
{
right = mid - 1;
}
mid = (right - left) / 2 + left;
if (arr[mid] < x)
{
left = mid + 1;
}
else if (x == arr[mid])
{
printf(“找到了,数组下标是:%d”, mid);
break;
}
}
if (left > right) //这个if语句一定要加,因为跳出循环也可能是因为找了一圈没有找到
printf(“找不到\n”);
system(“pause”);
return 0;
}