前言
在一个数组中查找某一个数字时,可以用传统的遍历法,即一个一个进行比对。
但当这组数是有序的(升序或降序),则最多需要查找n次,效率很低。
为此,可以引入二分法查找,在此与大家分享一个简单的二分法的应用。
一、二分法
也叫折半查找算法。普通的遍历算法复杂度为n,而二分法的复杂度为log2(n),大大减少查找次数。
个人觉得有点像高中时学的二分法。
二、代码
代码如下(示例):
#include<stdio.h>
//二分法查找有序数组
//数组 1 2 3 4 5 6 7 8 9 10 12 14 15 17
//下标 0 1 2 3 4 5 6 7 8 9 10 11 12 13
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 17 };
int num; //要查找的数字
int left = 0; //初始左下标从最左边开始
int right = sizeof(arr)/sizeof(arr[0])-1; //计算出整个数组的长度,然后-1得到右下标
printf("请输入要查找的数字:>");
scanf("%d", &num);
while (left <= right) //循环条件,只有当这个满足时才能继续查找,否则就找不到该数字了
{ //这里建议大家在草稿纸上演算一下就明白了
int mid = (left + right) / 2; //第一次先取最中间的数进行比对
if (arr[mid] > num) // 最中间的数大于要查的数字,表明其在中间数的左边,所以最多只可能到
{ // mid的左边一个数,所以赋值right = mid - 1
right = mid - 1;
}
else if (arr[mid] < num) //最中间的数小于要查的数字,表明其在中间数的右边,所以最少只可能到
{ //mid的右边一个数,所以赋值left = mid + 1
left = mid + 1;
}
else //若相等则肯定找到了
{
printf("找到了该数字,下标为:%d\n", mid);
break;
}
}
if (left > right) //当左右下标大小互换了说明肯定没有这个数字,停止查找
{
printf("未找到该数字\n");
}
return 0;
}