下面这个折半查找算法正确吗?如果正确,请给出算法的正确性证明,如果不正确,请说明产生错误的原因。 int BinSearch(int r[ ]. int n, int k) int low = 0, high =n-1; int mid; while (low <= high) mid =( low + high) / 2; if (k <r[mid]) high =mid; else if (k > r[mid]) low = mid: else return mid; ] return 0:
时间: 2024-04-07 22:32:18 浏览: 57
链式基数排序-折半查找算法
这个折半查找算法是正确的。
算法首先将指针 low 和 high 分别指向数组的第一个元素和最后一个元素。然后,算法在每次循环中计算中间元素的下标 mid,并将 mid 与目标值 k 进行比较。如果 k 小于 r[mid],则目标值在数组的左半部分,需要将 high 指针移动到 mid 的左边;如果 k 大于 r[mid],则目标值在数组的右半部分,需要将 low 指针移动到 mid 的右边;如果 k 等于 r[mid],则找到了目标值,返回 mid。
每次循环中,算法都会将搜索范围减半。因为数组已经排好序,所以每次比较都可以排除掉一半的元素。因此,算法的时间复杂度为 O(log n)。
最后,如果目标值不在数组中,算法会在 low > high 的时候退出循环,并返回 0。这是因为 low 和 high 指针相遇时,搜索范围已经缩小到了一个空区间,说明目标值不存在于数组中。
综上所述,这个算法是正确的。
阅读全文