Общее расширение BubbleSort

c# generics

1124 просмотра

3 ответа

1217 Репутация автора

    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 Оператор '>' не может быть применен к операндам типа 'T' и 'T'

Автор: Kubi Источник Размещён: 25.04.2011 10:13

Ответы (3)


2 плюса

92987 Репутация автора

Вы не можете использовать <параметры типа. Так что вы могли бы использовать Comparer<T>.Default.

Или вы можете просто добавить общее ограничение, которое требуется Tдля реализации IComparable<T>. Затем вы можете вызвать Compareметод.

Кроме того, ваш jцикл отключен на один. Вам нужно либо сравнить и поменять местами arr [j] и arr [j + 1], либо изменить нижнюю границу на, 1а верхнюю наarr.Length

Автор: CodesInChaos Размещён: 25.04.2011 10:19

10 плюса

15550 Репутация автора

Решение

Вы можете ограничить , 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массив.

Автор: ChrisWue Размещён: 25.04.2011 10:20

1 плюс

1911 Репутация автора

Несколько способов сделать это:

  1. Требовать T для реализации IComparable<T>и использования CompareToметода для сравнения.
  2. Добавьте второй параметр типа, IComparer<T>который реализует пользовательское сравнение. Затем вы будете использовать этот объект для сравнения ключей.
Автор: Tim Destan Размещён: 25.04.2011 10:21
Вопросы из категории :
32x32