Си.пирамидальная сортировка.Подсчитать кол-во перестановок и сравнений
Вроде бы сортировка работает правильно.По крайней мере, она сортирует верно :) Осталось только подсчитать кол-во сравнений и перестановок . Как это подсчитать и вывести?Как-то застопорился на этом моменте.. Буду очень благодарен за помощь.
#include <stdio.h>
#include <stdlib.h>
void keyDown(int* arr, int n, int head)
{
int j;
if(2*head + 2 < n && arr[2*head + 1] < arr[2*head + 2])
{
j = 2*head + 2;
}
else j = 2*head + 1;
while(arr[head] < arr[j] && head < n / 2)
{
int tmp = arr[head];
arr[head] = arr[j];
arr[j] = tmp;
head = j;
if(2*head + 2 < n && arr[2*head + 1] < arr[2*head + 2])
{
j = 2*head + 2;
}
else j = 2*head + 1;
}
}
void heapSort(int* arr, int n)
{
int i;
for(i = n/2 - 1; i >= 0; i--)
{
keyDown(arr,n,i);
}
int l = n;
while(l > 1)
{
l--;
int tmp = arr[l];
arr[l] = arr[0];
arr[0] = tmp;
keyDown(arr,l,0);
}
}
int main(int argc, char *argv[]) {
int n=10;
int start, end,i;
int *arr;
arr=(int *)malloc(n*sizeof(int));
time_t invocation_time = time(NULL);
srand(invocation_time);
int s;
for (s=0;s<n;s++)
{
arr[s] = rand() % 50;
printf ("%d \n", arr[s]);
}
printf ("\n");
heapSort(arr, n);
for (i=0;i<n;i++){
printf ("%d \n", arr[i]);
}
return 0;
}
Ответы (1 шт):
Ну а в чём реальная проблема-то?
На каждый if или while увеличивать счетчик сравнений на 2, если двойные условия, или на 1 для простого условия.
Там, где обмены происходят (c tmp) - увеличивать счётчик обменов.
Ещё один момент - количество реальных сравнений может быть меньше, чем подсчитанное для двойных условий, т.к. второе сравнение не будет выполняться в ряде случаев. Если это важно- разбить условия на два.
Кроме того, нужно определиться - учитывать ли заголовки циклов for?