通用BubbleSort扩展

时间:2011-04-25 22:13:09

标签: c# generics

    public static T[] BubbleSort<T>(this T[] arr) where T : class
    {
        for (int i = 0; i < arr.Length; i++)
        {
            for (int j = 0; j < arr.Length-1; j++)
            {
                if (arr[j - 1] > arr[j])
                    swap(arr[j - 1], arr[j]);
            }
        }
    }

如何创建通用冒泡排序扩展方法?有没有办法处理这里的比较? 错误1运算符'&gt;'不能应用于'T'和'T'类型的操作数

3 个答案:

答案 0 :(得分:10)

您可以将T限制为IComparable<T>,如下所示:

public static void BubbleSort<T>(this T[] arr) where T : IComparable<T>
{
    for (int i = 0; i < arr.Length; i++)
    {
        for (int j = 0; j < arr.Length-1; j++)
        {
            if (arr[j].CompareTo(arr[j + 1]) > 0)
                swap(arr[j], arr[j + 1]);
        }
    }
}

的优点是T也可以是int之类的值类型。此外,您的函数不需要在更改this数组时返回数组。

答案 1 :(得分:2)

您无法在类型参数上使用<。 所以你可以使用Comparer<T>.Default

或者您可以添加一个需要T来实施IComparable<T>的通用约束。然后,您可以调用Compare方法。

此外,您的j循环已被关闭。您需要比较&amp;交换arr [j]和arr [j + 1]或将下限更改为1,将上限更改为arr.Length

答案 2 :(得分:1)

您可以采取以下几种方式:

  1. 要求T实施IComparable<T>并使用CompareTo方法进行比较。
  2. 添加实现自定义比较的IComparer<T>类型的第二个参数。然后,您将使用此比较器对象进行密钥比较。