我正在用python编写一个程序,实现一个选择排序算法,并按降序对列表元素排序。
假设我的输入是l = [242, 18, 44, 201, 1111]
。
我的逻辑如下:l = [242, 18, 44, 201, 1111] # switch l[0] (242) and l[len(l)-1] (1111)
l = [1111, 18, 44, 201, 242] # switch l[1] (18) and l[len(l)-1] (242)
l = [1111, 242, 44, 201, 18] # switch l[2] (44) and l[len(l)-2] (201)
输出将是[1111, 242, 201, 44, 18]
。
下面是我基于上述逻辑实现的代码:
def selSort(l):
'''Sorts the list in descending order using a selection sort algorithm.
Params: l (list): unsorted list
Sorts: unsorted list in descending order
'''
start = len(l)-1
while start != 0:
for i in range(len(l)):
if l[i] < l[start]:
l[i], l[start] = l[start], l[i]
start -= 1
似乎我高估了我的逻辑,因为算法的输出是
[1111, 18, 242, 201, 44]
。经过一些调试,我发现经过几次遍历之后
l
得到了正确的排序,但是while循环仍然没有达到它的终止条件。这意味着start
和i
之间会有一些不必要的重叠。例如,当start = 3
和i = 4
时,l[i] < l[start]
会导致l = [1111, 242, 201, 18, 44]
。在一次额外的遍历之后,我们得到了上面显示的错误输出。对于这个问题,什么是优雅的(我知道选择排序不是最有效的算法)和蟒蛇式的解决方案?我试图在不使用任何内置函数(除了
len
和range
)、方法或外部库(如果可能的话)的情况下实现这一点。我查过这里的Selection Sort Algorithm Python和Selection Sort Algorithm in Java帖子前者使用列表方法(我正试图避免),而我对java语法的理解不够好,无法使用后者。
最佳答案
这应该管用。它还使用range()来避免使用while循环。
def selSort(l):
'''Sorts the list in descending order using a selection sort algorithm.
Params: l (list): unsorted list
Sorts: unsorted list in descending order
'''
for i in range(len(l)):
# Find the largest element in list
max_index = i
for j in range(i + 1, len(l)):
if l[max_index] < l[j]:
max_index = j
# Swap the first and max item
l[i], l[max_index] = l[max_index], l[i]
关于python - 程序未正确选择选择排序算法中列表中的最小值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53688630/