折半查找法,也称二分查找法,是一种常用的查找算法。其基本思想是将一个有序的数据集合,按照中间位置分成左右两个子序列,并判断要查找的数据与中间位置的关系,然后递归查找所在的子序列。
在15个数的数据集合中使用折半查找法,以下从多个角度进行分析,进一步深化对算法的理解。
思路分析
1. 数组必须有序
使用折半查找法查找一个数据的前提条件是,数组必须有序。如果数据集合无序,则需要先排序,采用其他的排序算法,比如冒泡排序、插入排序、快速排序等。
2. 折半查找法的时间复杂度为O(log n)
折半查找法的时间复杂度为O(log n),其中n表示数据集合的大小。折半查找法的时间复杂度比线性查找法的O(n)要快得多。这也是折半查找法常被使用的一个重要原因。
3. 折半查找法需要的空间复杂度为O(1)
折半查找法需要的空间复杂度为O(1),即算法只需要使用常量级别的额外空间,而不需要额外的内存空间来存储某些数据。这样可以节省内存资源,适用于内存不足的情况。
4. 折半查找法是一种不适合用于动态数据集合的算法
对于不断插入新数据的数据集合,折半查找法难以处理。因为每次插入新数据就需要重新排序,插入前面的数据,使数据集合有序。而插入后面的数据就需要移动后面的所有数据,代价较大。
实现过程
在15个数据的数据集合中,使用折半查找法找出数据为7的位置。
每次查找的过程如下:
1. 确定数组的中间位置
在一个有序的数据集合中,最中间的元素位置即为:(low+high)/2。
对于15个数来说,mid=(0+14)/2=7。
2. 判断要查找的数据在中间元素的哪一边
如果我们要查找的数据为7,和mid=7相等,那么就可以直接返回7所在位置。
如果我们要找的数据比mid位置元素小,那么我们就需要在左边继续查找。
如果我们要找的数据比mid位置元素大,那么我们就需要在右边继续查找。
3. 递归查找
根据上一步的判断,如果要继续查找,那么就需要在剩余的子序列中使用相同的方法来查找。
下面是完整的查找代码实现:
```
def binarySearch(arr, low, high, x):
# Check base case
if high >= low:
mid = (high + low) // 2
# If element is present at the middle itself
if arr[mid] == x:
return mid
# If element is smaller than mid, then it can only
# be present in left subarray
elif arr[mid] > x:
return binarySearch(arr, low, mid - 1, x)
# Else the element can only be present in right subarray
else:
return binarySearch(arr, mid + 1, high, x)
else:
# Element is not present in array
return -1
# Test array
arr = [2, 3, 4, 10, 40, 50, 60, 65, 70, 80, 90, 91, 92, 95, 100]
x = 7
# Function call
result = binarySearch(arr, 0, len(arr)-1, x)
if result != -1:
print("元素在数组中的索引为", str(result))
else:
print("元素不在数组中")
```
扫码咨询 领取资料