【问题标题】:Selection Sort from both ends with Min and Max Python使用 Min 和 Max Python 从两端进行选择排序
【发布时间】:2019-04-15 12:00:51
【问题描述】:

我需要实现一种方法,通过使用最小值和最大值从两端工作来提高选择排序的效率。

我让它只使用最小值的索引,但我仍然需要找到一种同时从最大值向后工作的方法。

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]

【问题讨论】:

    标签: python selection-sort


    【解决方案1】:

    也跟踪最大值并将其复制到列表的末尾 - 就像您处理最小值一样。

    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)
    

    【讨论】:

    • 你能进一步解释一下 Edge-Case 吗?什么是使用它的实例?
    猜你喜欢
    • 2017-05-30
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多