单行python中的插入/选择排序

单行python中的插入/选择排序,python,python-3.x,sorting,list-comprehension,Python,Python 3.x,Sorting,List Comprehension,在python中编写插入/选择排序的最佳方法可能是使用列表理解? 我知道这会管用的 选择: def selection(l): for i in range(0,len(l)): min_idx = i for j in range(i+1,len(l)): if l[min_idx] > l[j]: min_idx = j l[i],l[min_idx] =

在python中编写插入/选择排序的最佳方法可能是使用列表理解? 我知道这会管用的 选择:

def selection(l):
    for i in range(0,len(l)):
        min_idx = i
        for j in range(i+1,len(l)):
            if l[min_idx] > l[j]:
                min_idx = j
        
        l[i],l[min_idx] = l[min_idx],l[i]

l = [5,1,2,3,4]
selection(l)

Python方式?

您可以尝试缩短最小元素搜索:

def selection(l):
    for i in range(0, len(l)-1):
        min_idx = l.index(min(l[i:]), i)
        l[i], l[min_idx] = l[min_idx], l[I]
或具有恒定额外空间的替代变体(感谢@kaya3):

或一行解决方案(非最佳-可能会使用一些额外的空间+pop操作繁重):


@superbrain好的,但是有没有什么优化的或者类似Python的方法来实现这一点?@superbrain除非列表中保证有32个或更少的元素>>假设输入与问题中提供的相同,那么方法是什么?你能用恒定的额外空间来实现吗?(与正常选择排序一样)添加了没有额外空格的示例,而不是使用
min
查找最小值,然后
索引
再次搜索,
min(range(i,len(l)),key=l.\uu getitem\uuuuuuuuuuu>只需一次搜索即可完成(并且避免了切片或itertools的需要)@kaya3这就是我想让他们找到的确切答案:-)很好的答案,我会解决的
def selection(l):
    for i in range(0, len(l)-1):
        min_idx = min(range(i, len(l)), key=l.__getitem__)
        l[i], l[min_idx] = l[min_idx], l[i]
l = [l.pop(l.index(min(l))) for _ in range(len(l))]