我需要实现一种方法,通过使用最小和最大值在两端进行选择,从而使选择排序更加有效。
我让它仅使用最小值的索引就可以工作,但是我仍然需要找到一种从最大值同时进行反向工作的方法。
def selectionsort(alist):
for i in range(len(alist)):
min_idx = i
for j in range(i+1, len(alist)):
if alist[min_idx] > alist[j]:
min_idx = j
temp = alist[i]
alist[i] = alist[min_idx]
alist[min_idx] = temp
alist = [54,26,93,17,77,31,44,55,20]
selectionsort(alist)
print(alist)
该函数应返回顺序列表:[17、20、26、31、44、54、55、77、93]
答案 0 :(得分:0)
也要跟踪最大值并将其复制到列表的末尾-就像您对最小值一样。
def selection_sort(l):
i = 0
j = len(l) - 1
while i < j:
min_idx = i
max_idx = i
max_val = l[i]
for k in range(i, j+1):
if l[min_idx] > l[k]:
min_idx = k
if l[max_idx] < l[k]:
max_idx = k
max_val = l[k]
l[i], l[min_idx] = l[min_idx], l[i]
# Edge-case: if we shifted the value to the maximum in the last swap
if l[min_idx] == max_val:
l[j], l[min_idx] = l[min_idx], l[j]
else:
l[j], l[max_idx] = l[max_idx], l[j]
i += 1
j -= 1
return l
my_list = [54, 26, 93, 17, 77, 31, 44, 55, 20]
my_list = selection_sort(my_list)
print(my_list)