用于随机混洗相等元素的排序比较方法

cbp*_*cbp 2 language-agnostic sorting random algorithm comparison

这是给你的一个难题.

我想更改以下比较方法,以便当两个项目被认为相等时,它们将随机洗牌.

myList.Sort( (x, y) => x.Score.CompareTo(y.Score) );
Run Code Online (Sandbox Code Playgroud)

我可以想象这个场景在订购搜索结果时很有用,如果你不想在他们的分数相同的情况下优先考虑一个结果而不是另一个结果.

有人想试一试吗?

这是我第一次尝试解决方案,但它不起作用.我会告诉你原因.

class RandomizeWhenEqualComparer<T> : IComparer<T>
{
    private readonly Func<T, T, int> _comparer;

    public int Compare(T x, T y)
    {
            if (x.Equals(y)) return 0;

        int result = _comparer(x, y);

        if (result != 0) return result;

        double random = StaticRandom.NextDouble();
        return (random < .5) ? -1 : 1;
    }

    public RandomizeWhenEqualComparer(Func<T, T, int> comparer)
    {
        _comparer = comparer;
    }
}
Run Code Online (Sandbox Code Playgroud)

J-1*_*DiZ 7

首先随机播放,然后使用稳定的排序.