2016-11-17 3 views
0

У меня трудное время, чтобы понять, как преобразовать Selection Sort в Generics. Я написал классический алгоритм выбора Сортировка, не могли бы вы помочь мне понять, что вставка <T> & T.Преобразование выбора Сортировка в Generics <T>, T

class Program 
{ 
    static void Main(string[] args) 
    { 
     int[] numbers = { 34, 17, 23, 35, 26, 9, 13 }; 

     //Print Array in Selection Sort 
     SelectionSort(numbers); 
     for (int i = 0; i < numbers.Length; ++i) 
     { 
      Console.WriteLine(numbers[i] + " "); 
     } 

     Console.ReadLine(); 
    } 

    public static void SelectionSort(int [] numArray) 
    { 
     for (int i = 0; i < numArray.Length -1; ++i) 
     { 
      int minElement = numArray[i]; //Hold smallest remaining int @ i = 0 
      int minLocation = i; 

      for (int j = i + 1; j < numArray.Length; ++j) 
      { 
       if (numArray[j] < minElement) 
       { 
        minElement = numArray[j]; // Update index of minElement 
        minLocation = j; 
       } 
      } 

      //Swap 
      if (minLocation != i) 
      { 
       int temp = numArray[minLocation]; 
       numArray[minLocation] = numArray[i]; 
       numArray[i] = temp; 
      } 
     } 
    } 
} 

Насколько я могу понять из моего чтения, я могу только получить как:

public static void SelectionSort<T>(T[] numArray) : IComparable 

Спасибо за любую помощь, которую вы можете предоставить с остальной частью алгоритма выбора сортировки.

ответ

3

В принципе, вы должны сначала изменить подпись. Поскольку вы больше не хотите передавать массив int, но общий массив, вам необходимо изменить тип параметра на T[]. Для того, чтобы работать, вам нужно сделать метод родовым путем добавления параметра типа там также:

public static void SelectionSort<T>(T[] numArray) 

Поскольку тип элемента теперь T вместо int, вам нужно заменить все int S, которые ссылались на элемент значение от T. Например:

// minElement is an element of the array, so its type is T 
T minElement = numArray[i]; 

// but the location is an index, so that stays an int 
int minLocation = i; 

После того, как вы сделали это, вы столкнетесь с вопросом компилятора, который вы не можете использовать оператор < на T. Это связано с тем, что нет информации о типе T, в котором говорится, что у него есть заказ. Итак, мы здесь используем ограничение общего типа на T. Здесь мы используем интерфейс IComparable<T>; используя его изменения сигнатуру метода в следующем:

public static void SelectionSort<T>(T[] numArray) 
    where T: IComparable<T> 

После того, как мы есть, что мы можем заменить < сравнение с вызовом CompaterTo:

if (numArray[j].CompareTo(minElement) < 0) 

И это будет все, что нужно сделать для Этот метод. Это полностью преобразованный код:

public static void SelectionSort<T>(T[] numArray) 
    where T: IComparable<T> 
{ 
    for (int i = 0; i < numArray.Length -1; ++i) 
    { 
     T minElement = numArray[i]; 
     int minLocation = i; 

     for (int j = i + 1; j < numArray.Length; ++j) 
     { 
      if (numArray[j].CompareTo(minElement) < 0) 
      { 
       minElement = numArray[j]; 
       minLocation = j; 
      } 
     } 

     if (minLocation != i) 
     { 
      T temp = numArray[minLocation]; 
      numArray[minLocation] = numArray[i]; 
      numArray[i] = temp; 
     } 
    } 
} 
+0

Большое вам спасибо! Я не мог понять, где разместить CompareTo(), и у меня было трудное время с Swap - я не ставил T temp. Большое спасибо за помощь! –