List 高效的自动排序列表python

List 高效的自动排序列表python,list,sorting,python-2.7,List,Sorting,Python 2.7,我想用python编写一个list lie类,它在添加数字时自动进行排序。这是为了好玩,不是为了上课:p我想知道做这件事最有效的方法是什么。我应该这样做吗 class SortedList: def __init__(self, data): self.data = list(data) def add(self, num): self.data.append(num) self.data.sort() 有更好的方法吗?-Edi

我想用python编写一个list lie类,它在添加数字时自动进行排序。这是为了好玩,不是为了上课:p我想知道做这件事最有效的方法是什么。我应该这样做吗

class SortedList:
    def __init__(self, data):
        self.data = list(data)

    def add(self, num):
        self.data.append(num)
        self.data.sort()
有更好的方法吗?

-Edit-
sort()
是O(n log n)。在每个添加的数字之后通过排序将n个数字添加到列表中将是O(n^2 log n)(但实际上这可能比O(n^2)算法快,这取决于排序的优化)

更好的O实现是用O(n)时间搜索插入位置,用O(n)时间向列表中添加新数字(总时间仍然是O(n))。向列表中添加n个数字将是O(n^2)。代码如下:

def addFaster(self, num):
    index = 0
    if(len(self.data) == 0):
        self.data = [num]
    else:
        for i in range(0, len(self.data)):
        if(self.data[i] >= num):
            self.data.insert(i, num)
            return
        self.data.append(num)
通过二进制搜索,我们可以在O(logn)时间内找到正确的索引。向列表中添加新编号是O(n)。由于整个操作(比以前更好)是O(n),因此将n个数字添加到列表中就是O(n^2),常数较低。(不包括代码)

但是,如果您要在大的组中添加新的数字,那么如果您一次将它们全部添加(使用
extend()
)然后进行排序,则会大大加快算法的速度。然后,添加n个数字将在O(n log n)时间内完成(与排序时间相同)

请参见

-Edit-
sort()
是O(n log n)。在每个添加的数字之后通过排序将n个数字添加到列表中将是O(n^2 log n)(但实际上这可能比O(n^2)算法快,这取决于排序的优化)

更好的O实现是用O(n)时间搜索插入位置,用O(n)时间向列表中添加新数字(总时间仍然是O(n))。向列表中添加n个数字将是O(n^2)。代码如下:

def addFaster(self, num):
    index = 0
    if(len(self.data) == 0):
        self.data = [num]
    else:
        for i in range(0, len(self.data)):
        if(self.data[i] >= num):
            self.data.insert(i, num)
            return
        self.data.append(num)
通过二进制搜索,我们可以在O(logn)时间内找到正确的索引。向列表中添加新编号是O(n)。由于整个操作(比以前更好)是O(n),因此将n个数字添加到列表中就是O(n^2),常数较低。(不包括代码)

但是,如果您要在大的组中添加新的数字,那么如果您一次将它们全部添加(使用
extend()
)然后进行排序,则会大大加快算法的速度。然后,添加n个数字将在O(n log n)时间内完成(与排序时间相同)


请参见

您指定要将其作为一个列表来实现;您是否考虑过将数据结构视为堆?可能更适合你想做的事情


请参阅。

您指定要将其作为列表实现;您是否考虑过将数据结构视为堆?可能更适合你想做的事情


瞧。

很抱歉,我花了这么长时间才接受这个答案,这正是我想要的。谢谢对不起,我花了这么长时间才接受这个答案,这正是我想要的。谢谢