当我在奇数或偶数之间进行实现更改时,我可以获得预期的结果,但是,当我添加条件时,每次更改后结果仍然是无序的,检查偶数或奇数的输出示例
n = len(lista)
for i in range(1, n, 2):
min_index = i
for j in range(i + 1, n, 2):
if lista[j] < lista[min_index]:
if j > min_index:
min_index = j
lista[i], lista[min_index] = lista[min_index], lista[i]
print(lista)
for i in range(2, n, 2):
max_index = i
for j in range(i + 1, n, 2):
if lista[j] > lista[max_index]:
if j > max_index:
max_index = j
lista[i], lista[max_index] = lista[max_index], lista[i]
print(lista)
return lista
主要错误是
i
不是必须发生交换的地方:
奇数迭代中的索引与偶数迭代中的索引应该完全不同。在奇数迭代中,索引应为 0(对于第一次迭代)、1(对于第三次迭代)、2(对于第五次迭代)...对于偶数迭代,索引应该为 n 𝑛−1 (对于第二次迭代)、𝑛−1 2(第四次迭代),...等等,所以这通常是不是
i
的值
您还应该调整范围以搜索最小值/最大值。当迭代发生时,数组的右侧也会得到一个已排序的段,因此搜索不应该一直走到数组的末尾。
如果维护尚未排序的段的最左和最右索引,会更容易。随着迭代的进行,这个窗口会变得越来越小。
这是更正后的代码:
def ordenacao_por_selecao_modificada(arr):
n = len(arr)
left = 0
right = n - 1
for i in range(1,n):
if i % 2 == 1:
indice_maior = right
for j in range(left, right + 1):
if arr[j] > arr[indice_maior]:
indice_maior = j
print(lista)
arr[right], arr[indice_maior] = arr[indice_maior], arr[right]
right -= 1
else:
indice_menor = left
for j in range(left, right + 1):
if arr[j] < arr[indice_menor]:
indice_menor = j
print(lista)
arr[left], arr[indice_menor] = arr[indice_menor], arr[left]
left += 1