比较函数必须是对称的吗? (或:使用“不关心”值对列表进行排序)

时间:2011-12-19 17:41:26

标签: sorting

我有一个带有枚举属性的对象列表,我希望按其排序。在枚举值中,我只关心A,B和C,并要求在排序列表中,A< B< C.对于值D,E,......,它们的顺序无关紧要,如果它们散布在列表中则无关紧要。

在实施比较时,是否有必要为无关的枚举值指定相对于临界值的一致排序?例如,如果A,D之间的比较结果为-1,而D,A之间的比较结果为0,或者还是-1,则会导致问题吗?

此代码正在C#中实现,我相信使用quicksort。在查看了快速排序算法后,如果其中一个无关的值成为支点,看起来这可能是一个问题。

实施方式 - 对这样的事情进行排序的最佳方法是什么?必须明确处理无关的值导致需要处理更多案例。我可能可以为枚举分配值,但不能保证在其他情况下不会有不同的排序顺序。我不确定是否足以简单地假设列表在排序之前将被剥去额外的值,因为这可能会导致在违反假设时很难找到的错误。当使用这些值时,我可以抛出ArgumentException,但后来我会添加足够的情况,我可能只是对它们进行排序。关于我能想出的最佳选择是创建一个转换函数来将枚举转换为整数。

1 个答案:

答案 0 :(得分:1)

通常,是的,比较需要保持一致。 (我不是说那里的所有算法的情况都是如此,但例如它适用于qsort,你应该坚持这一点。)

您可以采取哪些措施来简化您的案例只是考虑所有不感兴趣的值是相等的,并且它们都小于A或大于C.

这样,它们会被打包在结果的顶部或底部,你的比较功能不应该太复杂。