Сортировка шаблонов в C ++ - PullRequest
1 голос
/ 07 мая 2010

Привет всем, я пытаюсь написать функцию сортировки, но у меня возникают проблемы с выяснением, как инициализировать значение, и заставить эту функцию работать как универсальный шаблон. Сортировка работает по:

Найдите пару = (ii, jj) = с минимальным значением = ii + jj =, например, при A [ii]> A [jj] Если такая пара существует, то поменяйте местами A [II] и A [JJ] еще перерыв;

Функция, которую я написал, выглядит следующим образом:

template <typename T>
void sort(T *A, int size)
{
 T min =453;
 T temp=0;
 bool swapper = false;
  int index1 = 0, index2 = 0;
  for (int ii = 0; ii < size-1; ii++){
   for (int jj = ii + 1; jj < size; jj++){
    if((min >= (A[ii]+A[jj])) && (A[ii] > A[jj])){
     min = (A[ii]+A[jj]);
     index1 = ii;
     index2 = jj;    
     swapper = true;
    }
   }
  }
  if (!swapper)
   return;
  else
  {
   temp = A[index1];
   A[index1] = A[index2];
   A[index2] = temp;
   sort(A,size);
  }
 }

Эта функция будет успешно сортировать массив целых чисел, но не массив символов. Я не знаю, как правильно инициализировать значение min для начала сравнения. Я попытался инициализировать значение, просто сложив вместе первые два элемента массива (min = A [0] + A [ 1]), но мне кажется, что для этого алгоритма он потерпит неудачу. Я знаю, что это своего рода странный тип сортировки, но это практика для теста, так что спасибо за любой вклад.

Ответы [ 3 ]

2 голосов
/ 07 мая 2010

наиболее вероятная причина неудачи, потому что char = 453 не выдает 453, а скорее другое число, в зависимости от того, какой символ (со знаком или без знака) Ваше непосредственное решение было бы использовать numeric_limits, http://www.cplusplus.com/reference/std/limits/numeric_limits/

Вам также может понадобиться подумать о дизайне, поскольку у char небольшой диапазон, вы, вероятно, будете часто переполняться при добавлении двух символов.

1 голос
/ 07 мая 2010

Максимальное значение любого типа std::numeric_limits<T>::max(). Это определено в <limits>.

Также рассмотрим редизайн. Это не хороший алгоритм. И я хотел бы убедиться, что знаю, что делаю, прежде чем рекурсивно вызывать мою sort функцию.

0 голосов
/ 07 мая 2010

Я не слишком много времени уделяю чтению вашего алгоритма, но в качестве альтернативы std::numeric_limits вы можете использовать начальный элемент в вашем массиве в качестве начального минимального значения.Тогда вам не нужно беспокоиться о том, что произойдет, если вы вызовете функцию с классом, который не специализируется std::numeric_limits и, следовательно, не может сообщить максимальное значение.

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