选择使用Min和Max Python从两端进行排序

时间:2019-04-15 03:28:10

标签: python selection-sort

我需要实现一种方法,通过使用最小和最大值在两端进行选择,从而使选择排序更加有效。

我让它仅使用最小值的索引就可以工作,但是我仍然需要找到一种从最大值同时进行反向工作的方法。

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]

1 个答案:

答案 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)