python - 这是有效的堆排序吗?

标签 python algorithm sorting heap

在过去的 6 个小时里,我一直在阅读有关构建堆排序的教程和学术 Material 。我终于在 python 中原型(prototype)化了一些对整数列表进行排序的东西。但是,我不完全确定我的解决方案是否构成有效的堆排序。这是一个非常简单的解决方案,绝对可以改进,但我想知道它是否有效。令人困惑的是,每个人似乎都有自己“首选”的实现该算法的方式。

提前非常感谢。

def heapsort(array):
    array = heapify(array)
    array = insert(array, 9999)
    print(array)

def heapify(array):
    end = len(array)
    i = 0
    j = 0
    while i < end:
        while j < end:
            if array[i] > array[j]:
                array = swap(array, i, j)
            j += 1
        i += 1
        j = i
    return array

def insert(array, x):
    array.append(x)
    return heapify(array)


def swap(array, a, b):
    temp = array[a]
    array[a] = array[b]
    array[b] = temp
    return array

def main(array):
    heapsort(array)

if __name__ == '__main__':
    array = [3, 1, 2, 4, 6, 7, 9, 0]
    main(array)

最佳答案

您的 heapify() 应该比较堆(树结构)中的父/子元素。它们在数组中的相对位置是

ChildIndex = 2 * Parent Index + [0|1]  # two children per parent

就数组索引而言。这在您的实现中并不明显。

关于python - 这是有效的堆排序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30564379/

相关文章:

algorithm - 面试题: Merge two sorted singly linked lists without creating new nodes

php - 从 facebook 和 twitter 好友中找到相似度分数的算法?

快速排序不能变成稳定排序吗?

java - 对版本号进行排序

python - numpy 的 c 源代码中的 at 符号 (@) 是如何使用的?

linq - 哈希登录然后用 linq 搜索它

Python Pandas : Index a value and boolean comparison

java - 使用 JSTL,如何读取 set 的元素,以便它们按 "date"(java.util.Date) 属性排序?

python - 使用pyqt4从相机流式传输视频

python - 为什么对象中的字典与其他字典没有区别?