#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