我们已经在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
1条答案
按热度按时间rvpgvaaj1#
你没有正确计算比较:您必须将测试分开,以确定实际发生比较的时间。
以下是修改后的版本: