我正在尝试在python中实现Selection排序算法。 我的第一个for循环没有考虑更新列表:如何克服这个问题?
def SelectionSort(a):
for m_index,x in enumerate(a[:-1]):
pos = m_index
temp = x
for index,y in enumerate(a[pos+1:]):
if y < temp :
temp = y
to_swap = len(a) - len(a[pos+1:]) + index
else:
continue
#swapping positions
temp_var = a[to_swap]
a[to_swap] = a[pos]
a[pos] = temp_var
return a
print(SelectionSort(a))
答案 0 :(得分:0)
你有两个错误:
x
的值将从原始数组的副本中获取。平均时间内可能发生的交换在原始数组上,而x
只会从使用a[:-1]
的副本中获取下一个值。解决此问题的一种方法是忽略x
,而忽略temp = a[pos]
而不是temp = x
。
有时内部循环永远不会进入if
块。在这种情况下,to_swap
的值将是未定义的(如果它发生在外部循环的第一次迭代中),或者更糟糕的是,它将是它在外部循环的先前无关迭代中具有的值。解决此问题的一种方法是在启动内循环之前初始化to_swap = pos
。
这些是使其运作所需的最小更改次数:
def SelectionSort(a):
for m_index, x in enumerate(a[:-1]):
pos = m_index
# 1. Make sure to grab the value from the current array, not the original
temp = a[pos]
print(temp, x)
# 2. Make sure to always initialise to_swap again!
to_swap = pos
for index, y in enumerate(a[pos+1:]):
if y < temp:
temp = y
to_swap = len(a) - len(a[pos+1:]) + index
temp_var = a[to_swap]
a[to_swap] = a[pos]
a[pos] = temp_var
return a
然而:
a[:-1]
,a[pos+1:]
)to_swap
的更新归结为to_swap = pos + 1 + index
a[to_swap], a[pos] = a[pos], a[to_swap]
所以,这将是一个更好的实现:
def SelectionSort(a):
for pos in range(0, len(a)-1):
temp = a[pos]
to_swap = pos
for index in range(pos+1, len(a)):
y = a[index]
if y < temp:
temp = y
to_swap = index
a[to_swap], a[pos] = a[pos], a[to_swap]
return a