【问题标题】:Does List<T>.Sort suffer worst case performance on sorted lists?List<T>.Sort 在排序列表上是否遭受最坏情况的影响?
【发布时间】:2012-09-17 16:37:54
【问题描述】:

根据the docsList&lt;T&gt;.Sort使用快速排序算法。我听说如果没有明智地选择枢轴,当在预排序列表上调用时,这可能会表现出最差的性能。

QuickSort 的 .NET 实现是否会在预排序列表上遇到最坏情况?

就我而言,我正在编写一个将对列表进行一些处理的方法。需要对列表进行排序才能使该方法起作用。在大多数使用情况下,列表将通过已经排序,但对顺序进行一些小的更改并非不可能。我想知道在每个方法调用上重新排序列表是否是个好主意。不过很明显,我掉进了premature optimization 的陷阱。

【问题讨论】:

  • 或者我应该在排序之前随机化列表?
  • .NET 实现无法避免最坏的情况,因为这只是快速排序算法的一个特征。
  • 什么会导致您认为您的数据已排序?还是几乎排序?您能否根据这些标准做出决定?
  • @dlev 当列表被构建时,它会被正确排序,但是在那之后没有什么可以阻止另一个方法调用Add
  • @RichardTowers 在这种情况下,也许您应该阻止其他方法破坏已排序的属性。您可以限制对列表的直接访问,并通过维护排序不变量的方法来调解访问。然后您可以跳过“检查排序然后排序”步骤,因为您可以始终对排序充满信心。这是你的清单;你有权力!

标签: c# performance quicksort


【解决方案1】:

编辑:我已经编辑了问题。

我猜我的问题被问得很糟糕。真的应该是:

List&lt;T&gt;.Sort 在排序列表上的性能最差吗?

答案似乎是“否”。

我做了一些测试,似乎排序列表比随机列表需要更少的比较来排序:https://gist.github.com/3749646

const int listSize = 1000;
const int sampleSize = 10000;

var sortedList = Enumerable.Range(0,listSize).ToList();
var unsortedList = new List<int>(sortedList);

var sortedCount = 0;
sortedList.Sort((l,r) => {sortedCount++; return l - r;});
//sortedCount.Dump("Sorted");
// Returns: 10519   

var totalUnsortedComparisons = 0;
for(var i = 0; i < sampleSize; i++)
{
    var unsortedCount = 0;
    unsortedList.Shuffle();
    unsortedList.Sort((l,r) => {unsortedCount++; return l - r;});
    totalUnsortedComparisons += unsortedCount;
}

//(totalUnsortedComparisons / sampleSize).Dump("Unsorted");
// Returns: 13547

当然,@dlev 提出了一个有效的观点。我不应该让自己陷入不确定我的列表是否已排序的情况。

我已改用SortedList 来避免此问题。

【讨论】:

    【解决方案2】:

    除非您有硬性指标可以进行比较,否则您将陷入过早的优化陷阱。在循环中运行您的代码超过 1000 次,并使用两种不同的方法收集执行时间,看看哪种方法更快,以及它是否有所作为。

    【讨论】:

      【解决方案3】:

      选择正确的算法并不是过早的优化。

      当您的列表已经排序或接近排序时,使用稳定排序是有意义的。 .NET ships with one, LINQ's OrderBy implementation. 不幸的是,它会多次复制您的整个列表,但复制仍然是 O(N),因此对于非平凡的列表,这仍然会更快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-30
        • 2010-11-07
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多