二分查找算法是一种在有序数组中查找特定元素的快速算法。它的基本思想是:通过将待查找的区间分成两半,判断要查找的元素可能在哪一半中,然后继续在可能的那一半中查找,以此类推,直到找到要查找的元素或者查找区间被缩小为0。
以下是实现二分查找算法的Python代码示例:
python复制代码
def binary_search(arr, target): | |
""" | |
在有序数组arr中查找目标值target,如果找到则返回其索引,否则返回-1 | |
:param arr: 有序数组 | |
:param target: 目标值 | |
:return: 目标值在数组中的索引,如果未找到则返回-1 | |
""" | |
left, right = 0, len(arr) - 1 # 定义查找的左右边界 | |
while left <= right: # 当左边界小于等于右边界时,继续查找 | |
mid = (left + right) // 2 # 计算中间位置 | |
if arr[mid] == target: # 如果中间位置的元素正好是目标值,返回其索引 | |
return mid | |
elif arr[mid] < target: # 如果中间位置的元素小于目标值,说明目标值在右半部分 | |
left = mid + 1 | |
else: # 如果中间位置的元素大于目标值,说明目标值在左半部分 | |
right = mid - 1 | |
# 如果循环结束还没有找到目标值,则返回-1 | |
return -1 | |
# 示例 | |
arr = [1, 2, 4, 5, 6, 8, 9] | |
target = 5 | |
print(binary_search(arr, target)) # 输出: 3 | |
target = 3 | |
print(binary_search(arr, target)) # 输出: -1 |
这段代码首先定义了查找的左右边界left和right,然后在while循环中通过计算中间位置mid来缩小查找范围。根据中间位置的元素与目标值的大小关系,更新左右边界的值,直到找到目标值或者查找区间被缩小为0(即left大于right)。如果找到目标值,则返回其索引;如果未找到,则返回-1。
如何将二维列表转换为有序列表
将二维列表(列表的列表)转换为有序列表(一维列表,且其中的元素按照某种顺序排列)的过程通常涉及两个主要步骤:首先,将二维列表“展平”成一维列表;其次,对这个一维列表进行排序。这里,我们假设的“有序”是指元素按照升序或降序排列,但你也可以根据需要实现自定义排序。
以下是使用Python实现这一过程的示例代码:
第一步:展平二维列表
有多种方法可以展平二维列表。这里使用列表推导式作为示例:
python复制代码
def flatten_list(nested_list): | |
"""展平二维列表""" | |
return [item for sublist in nested_list for item in sublist] | |
# 示例二维列表 | |
nested_list = [[1, 2], [3, 4, 5], [6]] | |
# 展平后的列表 | |
flat_list = flatten_list(nested_list) | |
print(flat_list) # 输出: [1, 2, 3, 4, 5, 6] |
第二步:对一维列表进行排序
一旦你有了展平后的一维列表,就可以使用Python内置的sorted()函数或列表的sort()方法来排序这个列表。
使用sorted()函数(这会返回一个新列表,原列表不会被修改):
python复制代码
sorted_list = sorted(flat_list) # 默认情况下是升序 | |
print(sorted_list) # 输出: [1, 2, 3, 4, 5, 6] | |
# 如果需要降序,可以指定reverse=True | |
sorted_list_desc = sorted(flat_list, reverse=True) | |
print(sorted_list_desc) # 输出: [6, 5, 4, 3, 2, 1] |
使用列表的sort()方法(这会直接修改原列表):
python复制代码
flat_list.sort() # 默认情况下是升序 | |
print(flat_list) # 输出: [1, 2, 3, 4, 5, 6] | |
# 如果需要降序,同样可以指定reverse=True | |
flat_list.sort(reverse=True) | |
print(flat_list) # 输出: [6, 5, 4, 3, 2, 1] | |
# 注意:此时flat_list已经被修改 |
结合使用
如果你想要一步到位,即直接从二维列表转换到有序的一维列表,可以将上述两个步骤结合在一个函数中:
python复制代码
def flatten_and_sort(nested_list, reverse=False): | |
"""展平二维列表并排序""" | |
flat_list = [item for sublist in nested_list for item in sublist] | |
if reverse: | |
return sorted(flat_list, reverse=True) | |
return sorted(flat_list) | |
# 示例 | |
nested_list = [[3, 1], [4, 1, 5, 9], [2, 6]] | |
sorted_flat_list = flatten_and_sort(nested_list) | |
print(sorted_flat_list) # 输出: [1, 1, 2, 3, 4, 5, 6, 9] | |
sorted_flat_list_desc = flatten_and_sort(nested_list, reverse=True) | |
print(sorted_flat_list_desc) # 输出: [9, 6, 5, 4, 3, 2, 1, 1] |