【问题标题】:How is Icomparer.Compare() method called when Sort is implemented?实现 Sort 时如何调用 Icomparer.Compare() 方法?
【发布时间】:2014-06-12 10:17:34
【问题描述】:
  • 谁调用 Icomparer.Compare() 方法?

考虑以下示例。

Array.Sort(Myfiles, new customSort())
.
.
.
private class customSort : IComparer<object>
{
 public override int Compare(obj A, obj B)
 {
   return (A.Value==B.Value?(0):((A.Value < B.Value)?(-1):(1)));
 }
}

如果 Myfiles 包含对象集合,

  • A 和 B 如何决定
  • Myfiles 集合中的 A 和 B 是连续的对象吗?
  • 如果不是,如何从 Myfiles 中选择 A 和 B?
  • Array.Sort() 方法是否必须对其执行任何操作?

【问题讨论】:

  • 如果您想提出不同的问题,请不要编辑您的帖子。只需创建一个新的。

标签: c# .net sorting compare icomparer


【解决方案1】:

该方法使用内省排序(introsort)算法如下:

  • 如果分区大小少于 16 个元素,则使用插入排序算法。
  • 如果分区数超过 2 * LogN,其中 N 是输入数组的范围,则使用 Heapsort 算法。
  • 否则,它使用快速排序算法。

来自http://msdn.microsoft.com/en-us/library/kwx6zbd4.aspx

对于第一个选项,这里有一个不错的 gif:http://en.wikipedia.org/wiki/Insertion_sort#mediaviewer/File:Insertion-sort-example-300px.gif

【讨论】:

    【解决方案2】:

    这取决于排序算法。当算法必须比较两个对象以确定它们的相对顺序时,它会调用Compare 方法。

    对于像冒泡排序这样的算法,A 和 B 将是邻居,对于我现在能想到的任何其他东西,它们可能是集合中的任何对象。

    【讨论】:

      【解决方案3】:

      显然调用发生在Sort 方法中。所有其他问题都与Sort 方法的内部实现有关。尽管您可能会窥探实际逻辑,但通常不应该打扰,因为您只对最终结果感兴趣(即您的数组已排序)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-10
        • 2012-09-14
        • 2015-04-28
        • 1970-01-01
        • 1970-01-01
        • 2011-12-05
        相关资源
        最近更新 更多