我正在尝试编写此函数gensort(list)
,它接受一个数字列表并返回一个具有相同数字的新列表,但是从低到高排序。输出的一个例子就像是
>>> gensort([111, 1, 3.14])
[1, 3.14, 111]
我编写了一个函数来获取一个元素并将其返回到升序中的位置:
def insert_sorted(elem,list):
if list == []:
return [elem]
elif elem < list[0]:
return [elem] + list
else:
return [list[0]] + insert_sorted(elem, list[1:])
现在我正在尝试将它应用到列表的其余部分,我想出了这个:
def gensort(list):
insert = insert_sorted(list[min],list)
return insert
然而,这至少不起作用。我想知道如何递归地使用insert_sorted,或者写一个不同的列表理解来让它返回我整个列表的正确顺序。
我知道有内置的排序工具,但我正在尝试用我目前所拥有的东西来编写它。
答案 0 :(得分:0)
为什么不使用排序? 如果你只是把数字放在那里,简单的做这样的事情:
insert_sorted(elem,list):
list.append(elem)
list.sort() // will sort in asc order
这不是一个工具,它是python中的标准功能。你的方法有很大的缺点,它很慢,内存需要长列表。更好的是将新元素添加到列表并在其上运行sort函数。
使用您的函数向n个元素数组添加元素,您将有n + 1个函数调用,创建n + 1个子数组。那就慢了,不可接受。如果您不想使用python排序,请使用一个循环排序算法。
python中的冒泡排序示例:
def bubble_sort(list_):
"""Implement bubblesort algorithm: iterate L to R in list, switching values
if Left > Right. Break when no alterations made to to list. """
not_complete = True
while not_complete:
not_complete = False
for val, item in enumerate(list_):
if val == len(list_)-1: val = 0
else:
if list_[val] > list_[val+1]:
list_[val], list_[val+1] = list_[val+1], list_[val]
not_complete = True
return list_
答案 1 :(得分:0)
您没有问是否创建自己的排序函数是个好主意,所以我会回答您提出的问题,使用insert_sorted创建完整的gensort函数:
def gensort(list):
sorted_list = []
for item in list:
sorted_list = insert_sorted(item, sorted_list)
return sorted_list