Си.пирамидальная сортировка.Подсчитать кол-во перестановок и сравнений

Вроде бы сортировка работает правильно.По крайней мере, она сортирует верно :) Осталось только подсчитать кол-во сравнений и перестановок . Как это подсчитать и вывести?Как-то застопорился на этом моменте.. Буду очень благодарен за помощь.

#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 шт):

Автор решения: MBo

Ну а в чём реальная проблема-то?

На каждый if или while увеличивать счетчик сравнений на 2, если двойные условия, или на 1 для простого условия.

Там, где обмены происходят (c tmp) - увеличивать счётчик обменов.

Ещё один момент - количество реальных сравнений может быть меньше, чем подсчитанное для двойных условий, т.к. второе сравнение не будет выполняться в ряде случаев. Если это важно- разбить условия на два.

Кроме того, нужно определиться - учитывать ли заголовки циклов for?

→ Ссылка