С. Кучи .Подсчитайте количество свопов и сравнений

#c #sorting #heap #swap #heapsort

Вопрос:

Сортировка, похоже, работает правильно. По крайней мере, он сортируется правильно 🙂 Осталось только посчитать количество сравнений и свопов. Как его рассчитать и вывести?Как-то застопорился на этом этапе.. Я буду очень благодарен вам за помощь.Если вы продемонстрируете это с обновленным кодом , я буду вдвойне благодарен.

 #include <stdio.h>
#include <stdlib.h>

void keyDown(int* arr, int n, int head)
{
    int j;
    if(2*head   2 < n amp;amp; arr[2*head   1] < arr[2*head   2])
    {
        j = 2*head   2; 
    }
    else j = 2*head   1;

    while(arr[head] < arr[j] amp;amp; head < n / 2)
    {
        int tmp = arr[head];
        arr[head] = arr[j];
        arr[j] = tmp;
    
        head = j;

        if(2*head   2 < n amp;amp; 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:

подсчитайте количество сравнений и свопов

создание функций

 //global counters
unsigned comparisons = 0, swaps = 0;

int lessthan(int a, int b) {
    comparisons  ;
    return (a < b);
}
void swap(int *a, int *b) {
    swaps  ;
    int tmp = *a; *a = *b; *b = tmp;
}
 

а затем замените сравнения и замены в существующем коде конкретной функцией, которая вам нужна.

 int main(int argc, char **argc) {
    //...
    if (lessthan(a[i], a[j])) swap(a i, a j);
    //...
    printf("comparisons: %u; swaps: %un", comparisons, swaps);
}
 

Комментарии:

1. большое вам спасибо, но я думаю, что сделал что-то не так 🙁 По какой-то причине я всегда получаю фиксированные числа 1 и 0. Не могли бы вы дополнить мой код своим собственным, но так, чтобы он работал правильно, если вам это не сложно, конечно? В любом случае, спасибо.

2. @LusindaBabaika: Я взял на себя смелость немного переформулировать ваш код (для моих предпочтений): ideone.com/GL2BvK

3. большое вам спасибо, надеюсь, я все понимаю!

4. Это просто в основном просто замена кода < с помощью вызова lessthan() и перезаписи выражений, т. е.: foo >= bar ==> > foo 1 > bar ==> > lessthan(bar, foo 1) . Я мог бы написать функцию greaterorequal() . Не стесняйтесь спрашивать о любых проблемах, которые у вас есть.

5. Возможно, я что-то упустил, но посмотри на это, пожалуйста. По какой-то причине программа преждевременно завершается, и создается пустой файл. Я хотел создать файл со статистикой сортировки. Для 100 элементов, для 200 и т. Д. И я беру среднее значение суммы свопов и сравнений за 5 исполнений. Но что-то не так ideone.com/CUB6XA