Использование Bubblesort и функции компаратора для сортировки массива структур - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь написать программу, которая сравнивает время, необходимое для сортировки массива struct Record с использованием как qsort (), так и алгоритма пузырьковой сортировки с использованием функций компаратора.Пользователь вводит, какой метод сортировки он хочет использовать и какой элемент структуры он хотел бы отсортировать.

struct Record {
int seqnum;
float threat;
unsigned int addrs[2];
unsigned short int ports[2];
char dns_name[NUMLTRS];
};

Мой qsort () работает безупречно, поэтому я считаю, что моя функция компаратора верна.Однако при использовании пузырьковой сортировки она сортируется неправильно.Вот пример одной из моих функций компаратора (seqnum).

int SeqNumCompare(const void *a, const void *b)
{
    struct Record *sa, *sb;

    sa = (struct Record *) a;
    sb = (struct Record *) b;

    if (sa->seqnum < sb->seqnum) return -1;
    else if (sa->seqnum > sb->seqnum) return 1;
    else return 0;
}

А вот моя функция пузырьковой сортировки.

void bubblesort(struct Record *ptr, int records,
    int (*fcomp)(const void *, const void *))
{
    int i, j;
    struct Record temp;
    for (i = 1; i < records; i++) {
        for (j = 0; j < records - i; j++) {
            if (fcomp(ptr + j, ptr + j + 1)) {
                temp = ptr[j];
                ptr[j] = ptr[j + 1];
                ptr[j + 1] = temp;
            }
        }
    }
}

Мне кажется, что это определенно должно работать, но массивнеправильно сортируется после вызова функции.Я отлаживал в течение нескольких часов и не могу найти ничего, что имеет смысл изменить.Можете ли вы увидеть какие-либо явные ошибки в моем коде сортировки пузырьков?

Функция пузырьковой сортировки вызывается в основной функции следующим образом:

if (sort_type == 2)   // bubble sort
{
    start = clock();
    if (sort_field == 1)
        bubblesort(rec_ptr, num_records, SeqNumCompare);
    else if (sort_field == 2)
        bubblesort(rec_ptr, num_records, ThreatCompare);
    else if (sort_field == 3)
        bubblesort(rec_ptr, num_records, AddrCompare);
    else if (sort_field == 4)
        bubblesort(rec_ptr, num_records, DNSNameCompare);
    end = clock();
}
...