LINUX.ORG.RU

Сортировка слиянием - анализ алгоритма


0

0

Имеется реализация алгоритма сортировки слиянием (код взят из wiki):

// a - сортируемый массив, его левая граница lb, правая граница ub
template<class T>
void mergeSort(T a[], long lb, long ub) { 
  long split;                   // индекс, по которому делим массив

  if (lb < ub) {                // если есть более 1 элемента

    split = (lb + ub)/2;

    mergeSort(a, lb, split);       // сортировать левую половину 
    mergeSort(a, split+1, last);// сортировать правую половину 
    merge(a, lb, split, ub);    // слить результаты в общий массив
  }
}

template<class T>
void merge(T a[], long lb, long split, long ub) {
// Слияние упорядоченных частей массива в буфер temp
// с дальнейшим переносом содержимого temp в a[lb]...a[ub]

  // текущая позиция чтения из первой последовательности a[lb]...a[split]
  long pos1=lb;

  // текущая позиция чтения из второй последовательности a[split+1]...a[ub]
  long pos2=split+1;

  // текущая позиция записи в temp
  long pos3=0;  

  T *temp = new T[ub-lb+1];

  // идет слияние, пока есть хоть один элемент в каждой последовательности
  while (pos1 <= split && pos2 <= ub) {
    if (a[pos1] < a[pos2])
      temp[pos3++] = a[pos1++];
    else
      temp[pos3++] = a[pos2++];
  }

  // одна последовательность закончилась - 
  // копировать остаток другой в конец буфера 
  while (pos2 <= ub)   // пока вторая последовательность непуста 
    temp[pos3++] = a[pos2++];
  while (pos1 <= split)  // пока первая последовательность непуста
    temp[pos3++] = a[pos1++];

  // скопировать буфер temp в a[lb]...a[ub]
  for (pos3 = 0; pos3 < ub-lb+1; pos3++)
    a[lb+pos3] = temp[pos3];

  delete temp[ub-lb+1];
}


Как добавить в него подсчет количества сравнений и обменов (или полуобменов?)


лабораторку делаешь, мерзавец?

Добавь соответстующие счетчики и инкременть их возле целевых операций.
Ещёселф-едьюкейшена ради попробуй valgrind(cachegrind тулзой) посмотреть — он тебе покажет сколько байт біло считано и сколько біло записано на каждую строчку твоего кода.

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

Remington
()
Ответ на: комментарий от Remington

В том и проблема, что со сравнениями все еще более-менее ясно, а вот с обменами - нет. Или это не обменный алгоритм?

Goblin
() автор топика
Ответ на: комментарий от Goblin

Не, это не обменный алгоритм. Обмены в нём считать не нужно. Точнее, про него известно, что количество обменов можно мажорировать как O(n*log(n)), где основание логарифма, как всегда, 2. Сам посмотри на алгоритм, подумай, и поймешь почему.

Remington
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.