算法描述:
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
二分查找的查找过程为:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
以例说法:
假如有一个元素个数为m的有序数组,现在要从中查找具体的某个数字n,如果从头到尾挨个查找的话,有可能要查找n次才找得到它,而要是用上二分查找的方法,能大大提升查找效率。(二分查找算法的时间复杂度为O(log(n)))
代码如下:(下为C语言代码,注意浏览代码的注释,这对于全面了解本例及代码思想十分重要)
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9,10 }; //假设现在有这样一个数组,里面共10个数。
int target = 7; //我们的目标是找到“7”这个数。
int sz = sizeof(arr) / sizeof(arr[0]); //这行代码的目的是把arr[]这个数组中元素的个数赋给sz。
int left = 0; // 表示arr[]数组的左下标
int right =sz - 1;// 表示arr[]数组的右下标
while (left <= right) //当arr[]数组左右下标错位了都还没查找到目标数字,那么该让它(循环)停下来了
{
int mid = (left + right) / 2; // 表示arr[]数组中位下标
if (arr[mid] > target)
{
right = mid-1; //二分法的思想就体现出来了
}
else if (arr[mid] < target)
{
left = mid+1;
}
else
{
printf("恭喜你成功找到!下标是:%d\n",mid);
break;
}
}
if (left > right)
printf("找不到~_~");
return 0;
}
文章到这里就结束啦~希望能对你有所启迪!