
在深入了解交替选择排序之前,我们首先回顾一下经典的选择排序算法。选择排序是一种简单直观的排序算法,其基本思想是:在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。它的时间复杂度为o(n^2)。
交替选择排序是对传统选择排序的一种修改,其核心规则如下:
这种修改使得排序过程在每次迭代中同时从两端“收敛”:一端放置最小值,另一端放置最大值。
在实现交替选择排序时,初学者常犯的错误主要集中在以下两点:
例如,一个典型的错误实现可能如下所示:
def ordenacao_por_selecao_modificada_errada(arr):
n = len(arr)
# 错误的实现,此处仅为示例,不应直接使用
for i in range(1, n): # i 代表迭代次数,而非目标索引
if i % 2 == 0: # 偶数迭代 (题目中是第2, 4, ... 次迭代,对应i=2, 4, ...)
# 错误:将最大值与 arr[i] 交换,i不是正确的右侧目标索引
indice_maior = i
for j in range(i, n): # 错误:搜索范围未正确缩小
if arr[j] > arr[indice_maior]:
indice_maior = j
print(arr) # 打印的 arr 可能不是交换后的状态,取决于打印位置
arr[i], arr[indice_maior] = arr[indice_maior], arr[i]
else: # 奇数迭代 (题目中是第1, 3, ... 次迭代,对应i=1, 3, ...)
# 错误:将最小值与 arr[i] 交换,i不是正确的左侧目标索引
indice_menor = i
for j in range(i, n): # 错误:搜索范围未正确缩小
if arr[j] < arr[indice_menor]:
indice_menor = j
print(arr) # 打印的 arr 可能不是交换后的状态
arr[i], arr[indice_menor] = arr[indice_menor], arr[i]
# 示例调用
# lista = [8, 2, 5, 1, 10, 4]
# ordenacao_por_selecao_modificada_errada(lista)上述代码的问题在于,无论奇偶迭代,它都尝试将找到的元素与arr[i]交换,并且搜索范围是从i到n-1。这与交替选择排序的逻辑不符,因为最小值应该去最左端,最大值应该去最右端,并且这两个端点会随着迭代而向内收缩。
为了正确实现交替选择排序,我们需要引入两个指针:left和right,它们分别标记当前未排序子区间的起始和结束索引。每次迭代后,这两个指针会向内移动,从而缩小未排序的范围。
def ordenacao_por_selecao_modificada(arr):
n = len(arr)
left = 0 # 未排序区间的左边界
right = n - 1 # 未排序区间的右边界
# 进行 N-1 次迭代。当 left >= right 时,所有元素都已归位
for i in range(1, n):
# 判断当前是奇数迭代还是偶数迭代
if i % 2 == 1: # 奇数迭代:寻找最小值并放置到 left 位置
# 假设当前 left 位置的元素是最小值
indice_menor = left
# 在当前未排序区间 [left, right] 中寻找真正的最小值
for j in range(left, right + 1):
if arr[j] < arr[indice_menor]:
indice_menor = j
# 打印当前列表状态(在交换前打印,以符合题目要求)
print(arr)
# 将找到的最小值与 arr[left] 交换
arr[left], arr[indice_menor] = arr[indice_menor], arr[left]
# 缩小未排序区间:左边界向右移动一位
left += 1
else: # 偶数迭代:寻找最大值并放置到 right 位置
# 假设当前 right 位置的元素是最大值
indice_maior = right
# 在当前未排序区间 [left, right] 中寻找真正的最大值
for j in range(left, right + 1):
if arr[j] > arr[indice_maior]:
indice_maior = j
# 打印当前列表状态(在交换前打印)
print(arr)
# 将找到的最大值与 arr[right] 交换
arr[right], arr[indice_maior] = arr[indice_maior], arr[right]
# 缩小未排序区间:右边界向左移动一位
right -= 1
# 优化:如果 left >= right,表示所有元素都已排序,可以提前结束
if left >= right:
break
# 示例调用
lista = [8, 2, 5, 1, 10, 4]
print("初始列表:", lista)
ordenacao_por_selecao_modificada(lista)
print("最终排序结果:", lista)交替选择排序提供了一个有趣的视角来理解选择排序的机制。通过引入动态的left和right指针,并根据迭代的奇偶性交替寻找最小值和最大值,我们可以有效地将元素放置到其最终的排序位置。理解并正确处理交换目标索引和搜索范围是实现此算法的关键。尽管其性能与传统选择排序相同,但它展示了如何通过巧妙的变体来解决特定的排序问题,加深对算法原理的理解。
以上就是交替选择排序:优化实现与常见陷阱解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号