我得到了在 Python 或 Java(或任何其他语言)中实现堆排序算法的任务。因为我在 Python 或 Java 方面并不是那么“流利”,所以我决定两者都做。
但在这里我遇到了一个问题,程序的运行时间比它“应该”的要高得多。我的意思是,堆排序应该运行到 O(n * log n) 并且对于在几个 GHz 的时钟频率上运行的当前处理器我没想到该算法会运行超过 2000 秒的数组大小为 320k
因此,对于我所做的,我从 Python 和 Java 中的此类伪代码实现了算法(我还尝试了 Rosetta Code 中的 Julia 中的代码,以查看运行时间是否相似,为什么是 Julia?随机选择)
所以我检查了小输入大小问题的输出,例如大小为 10、20 和 30 的数组。它似乎在两种语言/实现中正确排序的数组。
然后我使用实现相同算法的 heapq 库再次检查运行时间是否相似。当实际情况确实如此时,它让我感到惊讶……但经过几次尝试后,我尝试了最后一件事,即更新 Python,然后,使用 heapq 的程序比以前的程序运行得快得多。实际上,320k 阵列大约需要 2k 秒,现在大约为 1.5 秒左右。
我重试了我的算法,问题仍然存在。
所以这里是我实现的 Heapsort 类:
class MaxHeap:
heap = []
def __init__(self, data=None):
if data is not None:
self.buildMaxHeap(data)
@classmethod
def toString(cls):
return str(cls.heap)
@classmethod
def add(cls, elem):
cls.heap.insert(len(cls.heap), elem)
cls.buildMaxHeap(cls.heap)
@classmethod
def remove(cls, elem):
try:
cls.heap.pop(cls.heap.index(elem))
except ValueError:
print("The value you tried to remove is not in the heap")
@classmethod
def maxHeapify(cls, heap, i):
left = 2 * i + 1
right = 2 * i + 2
largest = i
n = len(heap)
if left < n and heap[left] > heap[largest]:
largest = left
if right < n and heap[right] > heap[largest]:
largest = right
if largest != i:
heap[i], heap[largest] = heap[largest], heap[i]
cls.maxHeapify(heap, largest)
@classmethod
def buildMaxHeap(cls, heap):
for i in range(len(heap) // 2, -1, -1):
cls.maxHeapify(heap, i)
cls.heap = heap
@staticmethod
def heapSort(table):
heap = MaxHeap(table)
output = []
如果您需要其余的代码来查看错误可能在哪里,请不要犹豫,我会提供它。只是不想无缘无故地共享整个文件。
如前所述,我预期的运行时间来自最坏情况下的运行时间:O(n * log n) 使用现代架构和 2.6GHz 的处理器我希望大约 1 秒或更短的时间(因为运行时间以纳秒为单位询问)我想即使是 1 秒也太长了)
杨__羊羊
相关分类