Performance 在获取或设置列表时,是否应该对其进行排序?

Performance 在获取或设置列表时,是否应该对其进行排序?,performance,list,sorting,Performance,List,Sorting,我经常遇到的一个决定是何时对项目列表进行排序。添加项目时,始终保持列表排序,或访问列表时 是否有提高性能的最佳实践,或者只是说:如果列表大部分被访问,则在列表更改时对其进行排序,反之亦然。答案很大。你应该描述并应用最适合你的案例的策略 如果您想要在访问/查找元素方面获得性能,一个好的决定是使用InsertionSort维护排序的列表(http://en.wikipedia.org/wiki/Insertion_sort) 只有在一些非常特殊的情况下,访问排序列表才可能是一个选项,当有许多插入时,

我经常遇到的一个决定是何时对项目列表进行排序。添加项目时,始终保持列表排序,或访问列表时


是否有提高性能的最佳实践,或者只是说:如果列表大部分被访问,则在列表更改时对其进行排序,反之亦然。

答案很大。你应该描述并应用最适合你的案例的策略

如果您想要在访问/查找元素方面获得性能,一个好的决定是使用InsertionSort维护排序的列表(http://en.wikipedia.org/wiki/Insertion_sort)

只有在一些非常特殊的情况下,访问排序列表才可能是一个选项,当有许多插入时,低访问和性能不是很重要


但是,还有许多其他选项:比如维护一个表示“列表已排序”的var,并在空闲或访问时(如果需要)在每次第n次插入时进行排序

我习惯于这样想:

  • 如果列表一次全部填充并且仅在读取之后,则以未排序的顺序添加元素,并在填充结束时对其进行排序(在复杂性方面,它需要
    O(n log n)
    加上填充的复杂性,这通常比添加元素时进行排序要快)
  • 相反,如果列表需要在完全填充之前读取,则必须按排序顺序添加元素(可能使用一些特殊的数据结构为您完成这项工作,如sortedlist、红黑树等)

    • 在每次访问时对列表进行排序是个坏主意。必须有一个在修改集合时设置的标志。仅当设置了此标志时,才需要排序,然后重置标志

      但最好的方法是,如果你有一个数据结构,它总是按照定义排序。这意味着,如果插入新元素,该元素将自动插入到正确的索引中,从而保持集合的排序


      我不知道您使用的是哪个平台/框架。我知道.NET提供了一个SortedList类,可以为您管理这种插入排序算法。

      谢谢您的回答,它帮了您很大的忙。我要处理的具体情况是使用快速排序,因此在添加项时设置一个标志,如果设置了标志,则在访问时进行排序是最好的解决方案。