如何在没有内置工具的情况下将列表项从低到高排序

时间:2014-10-05 16:24:57

标签: python list sorting

我正在尝试编写此函数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,或者写一个不同的列表理解来让它返回我整个列表的正确顺序。

我知道有内置的排序工具,但我正在尝试用我目前所拥有的东西来编写它。

2 个答案:

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