Java数据结构实现折半查找的算法过程解析
算法概述
折半查找又被称为二分查找,是一种用于在有序数组中查找指定元素的算法。折半查找的核心思想是利用有序数组的有序性,通过反复将搜索区间折半的方式来定位目标元素。因为每次都取搜索区间中间的值进行比较,所以其时间复杂度为O(log n),是一种高效的查找算法。
算法实现步骤
折半查找过程可以用递归或迭代两种方式实现,下面我们分别来介绍这两种实现方式的具体步骤。
递归方式实现折半查找
- 计算数组的中间位置,即middle = (low + high) / 2。
- 比较中间位置的值和目标值的大小关系,如果相等则返回中间位置下标,如果小于目标值则在右边继续查找,否则在左边继续查找。
- 重复上述步骤直到找到目标位置或搜索区间被缩小为空。
以下是示例代码:
int binarySearch(int[] nums, int target, int low, int high) {
if (low > high) {
return -1;
}
int middle = (low + high) / 2;
if (nums[middle] == target) {
return middle;
} else if (nums[middle] < target) {
return binarySearch(nums, target, middle + 1, high);
} else {
return binarySearch(nums, target, low, middle - 1);
}
}
迭代方式实现折半查找
- 初始化搜索区间为整个数组,即low=0,high=nums.length - 1。
- 计算数组的中间位置,即middle = (low + high) / 2。
- 比较中间位置的值和目标值的大小关系,如果相等则返回中间位置下标,如果小于目标值则在右边继续查找,否则在左边继续查找,并更新搜索区间的边界。
- 重复上述步骤直到找到目标位置或搜索区间被缩小为空。
以下是示例代码:
int binarySearch(int[] nums, int target) {
int low = 0, high = nums.length - 1;
while (low <= high) {
int middle = (low + high) / 2;
if (nums[middle] == target) {
return middle;
} else if (nums[middle] < target) {
low = middle + 1;
} else {
high = middle - 1;
}
}
return -1;
}
示例说明
假设有一个有序数组nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10},我们要查找其中的元素7。我们可以使用以上两种方式实现折半查找算法,以下是查找过程的详细说明。
递归方式示例
初始搜索区间为整个数组,即low=0,high=9,中间位置为middle=4,nums[middle]=5,小于目标值7,因此继续在右边查找。更新搜索区间为low=5,high=9,中间位置为middle=7,nums[middle]=8,小于目标值7,因此继续在右边查找。更新搜索区间为low=8,high=9,中间位置为middle=8,nums[middle]=9,小于目标值7,因此继续在右边查找。更新搜索区间为low=9,high=9,中间位置为middle=9,nums[middle]=10,大于目标值7,因此在左边查找。更新搜索区间为low=9,high=8,搜索区间为空,返回-1。
迭代方式示例
初始搜索区间为整个数组,即low=0,high=9,中间位置为middle=4,nums[middle]=5,小于目标值7,因此继续在右边查找。更新搜索区间为low=5,high=9,中间位置为middle=7,nums[middle]=8,小于目标值7,因此继续在右边查找。更新搜索区间为low=8,high=9,中间位置为middle=8,nums[middle]=9,小于目标值7,因此继续在右边查找。更新搜索区间为low=9,high=9,中间位置为middle=9,nums[middle]=10,大于目标值7,因此在左边查找。更新搜索区间为low=9,high=8,搜索区间为空,返回-1。
通过以上示例可以看出,在有序数组中实现折半查找算法,无论是递归方式还是迭代方式,其时间复杂度都为O(log n),比线性查找算法有更高的效率。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构实现折半查找的算法过程解析 - Python技术站