1

我正在用 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 = 3i = 4l[i] < l[start],导致l = [1111, 242, 201, 18, 44]。再次遍历之后,我们得到了我上面显示的错误输出。

对于这个问题,什么是优雅的(我知道选择排序不是最有效的算法)和 Pythonic 解决方案?我试图在不使用任何内置函数(lenand除外range)、方法或外部库(如果可能的话)的情况下实现这一点。

我已经在 SO 上查看了选择排序算法 PythonJava 中的选择排序算法。前者使用列表方法(我试图避免),而我对 java 语法的理解不够好,无法使用后者。

4

2 回答 2

2

这应该有效。它还使用 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]
于 2018-12-09T01:41:44.070 回答
2

选择排序算法的逻辑(降序):是对表进行 n-1 次迭代(n 是列表中元素的数量)。在第 i 次迭代中,我们选择索引 i+1 和 n 之间的最高元素,并将该元素与列表中位置 i 处的元素交换。这导致以下代码:

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)-1) :
        posMax = i
        for j in range(i+1,len(l)):
            if l[j] > l[posMax]:
                posMax = j
        l[posMax], l[i] = l[i], l[posMax]
    return l

l = selSort([242, 18, 44, 201, 1111])
print(l) #prints [1111, 242, 201, 44, 18]
于 2018-12-09T01:46:09.640 回答