C语言 堆排序方法的比较和交换次数

sirbozc5  于 2023-03-28  发布在  其他
关注(0)|答案(1)|浏览(94)

我们已经在C中实现了堆排序算法来对结构的数据进行排序。我需要显示已经进行的比较的数量和交换的数量,以比较实际和理论的复杂性。
为了计算迭代和交换,我有两个变量,我递增。问题是,如果我在适当的地方递增它们,因为结果是相同的。我猜缺少了一些东西,因为在我的情况下,对于90000条记录,我得到了比较:1312958和掉期:1312958.
这里有一个堆排序方法的简单实现

void heapify(Game *game, int n, int i, size_t *compCounter, size_t *swapCounter) {
    int largest = i;
    int left = 2 * i + 1;
    int right = 2 * i + 2;
    if (left < n && game[left].id > game[largest].id) {
        largest = left;
    }
    if (right < n && game[right].id > game[largest].id) {
        largest = right;
    }
    if (largest != i) {
        (*compCounter)++;
        (*swapCounter)++;
        swap(&game[i], &game[largest]);
        heapify(game, n, largest, compCounter, swapCounter);
    }
}

Game *heapSort(Game *game, int n, size_t *compCounter, size_t *swapCounter) {
    for (int i = n / 2 - 1; i >= 0; i--) {
        heapify(game, n, i, compCounter, swapCounter);
    }
    for (int i = n - 1; i >= 0; i--) {
        swap(&game[0], &game[i]);
        heapify(game, i, 0, compCounter, swapCounter);
    }
    return game;
}

更新
我改变了计算变量的位置,得到了以下结果:2895916比较和无交换:1402958.考虑到堆排序具有理论复杂度N * LogN,2895916远远超过了数字90000 * log(90000)
x一个一个一个一个x一个一个二个x

rvpgvaaj

rvpgvaaj1#

你没有正确计算比较:您必须将测试分开,以确定实际发生比较的时间。
以下是修改后的版本:

void heapify(Game *game, int n, int i, size_t *compCounter, size_t *swapCounter) {
    int largest = i;
    int left = 2 * i + 1;
    int right = 2 * i + 2;
    if (left < n) {
        (*compCounter)++;
        if (game[left].id > game[largest].id) {
            largest = left;
        }
    }
    if (right < n) {
        (*compCounter)++;
        if (game[right].id > game[largest].id) {
            largest = right;
        }
    }
    if (largest != i) {
        (*swapCounter)++;
        swap(&game[i], &game[largest]);
        heapify(game, n, largest, compCounter, swapCounter);
    }
}

相关问题