博客
关于我
python 堆排序
阅读量:795 次
发布时间:2023-03-07

本文共 1725 字,大约阅读时间需要 5 分钟。

堆排序详解:从代码到实践

堆排序是一种高效的排序算法,通过不断从堆顶取出最大值并调整剩余堆的结构,最终完成对整个数据集的排序。以下将从代码实现入手,详细阐述堆排序的工作原理。

核心算法思想

堆排序的核心思想可以总结为以下几个步骤:

  • 将数据构建成一个最大堆,堆顶的元素是当前最大的值
  • 将堆顶元素取出,放到结果集合中
  • 将剩余的数据重新调整为最大堆
  • 重复上述步骤,直到只剩下一个元素为止
  • 这种方法的时间复杂度为O(n log n),在数据量较大时表现尤为出色。

    代码实现解析

    以下是基于Python的堆排序实现代码:

    dataset = [16, 9, 21, 3, 13, 14, 23, 6, 4, 11, 3, 15, 99, 8, 22]for i in range(len(dataset)-1, 0, -1):    # 打印当前处理的数据段    print("-------", dataset[0:i+1], len(dataset), i)        # 重建最大堆    for index in range(int((i+1)/2), 0, -1):        p_index = index        l_child_index = 2 * p_index - 1        r_child_index = 2 * p_index        # 打印子节点索引        print("l index", l_child_index, "r index", r_child_index)                p_node = dataset[p_index - 1]        left_child = dataset[l_child_index]        # 交换父节点与左子节点        if p_node < left_child:            dataset[p_index - 1], dataset[l_child_index] = left_child, p_node            p_node = dataset[p_index - 1]        # 交换父节点与右子节点        if r_child_index < len(dataset[0:i+1]):            right_child = dataset[r_child_index]            if p_node < right_child:                dataset[p_index - 1], dataset[r_child_index] = right_child, p_node                p_node = dataset[p_index - 1]        else:            print("p node [%s] has no right child" % p_node)        # 将最大值移动到末尾    print("switch i index", i, dataset[0], dataset[i])    dataset[0], dataset[i] = dataset[i], dataset[0]    print("before switch", dataset[0:i+1])    print(dataset)

    代码解释

  • 初始化数据集:将待排序数据存储在dataset列表中
  • 逆序遍历数据集:从最后一个元素开始遍历到第一个元素
  • 重建最大堆:从中间位置开始向上调整,确保每个父节点大于等于子节点
  • 交换最大值:将当前堆顶的最大值移动到结果列表末尾
  • 重复过程:直到所有元素都被处理完毕
  • 实现效果展示

    通过上述代码,可以看到每一步的操作结果。例如,当处理到i=7时,数据集的前8个元素会被重新排列,最大值会被移动到末尾。

    总结

    堆排序通过不断重建最大堆的特性,实现了高效的排序过程。通过上述代码和详细解释,读者可以清晰地理解堆排序的工作原理及其实现方式。

    转载地址:http://vnofk.baihongyu.com/

    你可能感兴趣的文章
    Python 如何在 Web 环境中使用 Matplotlib 进行数据可视化
    查看>>
    python 如何把字符串转换成浮点数
    查看>>
    python 如果文件夹不存在就创建文件夹
    查看>>
    Python 如果有很多或以收缩形式
    查看>>
    Python 子进程 Popen 与 Pyinstaller
    查看>>
    Python 子进程 Popen.communicate() 等价于 Popen.stdout.read()?
    查看>>
    Python 子进程 Popen:为什么会出现“ls *.txt“?不行?
    查看>>
    Python 子进程参数
    查看>>
    python 字典 key 和value 互换
    查看>>
    Python 字典 vs If 语句速度
    查看>>
    python 字典sorted自定义排序,按照key or value排序
    查看>>
    python 字典和列表区别_元组列表和字典的主要区别是什么?
    查看>>
    python 字符串中特定字符替换,截取
    查看>>
    Python 字符串总结
    查看>>
    python 字符串显示中文_Python字符串开头的b"、u"、r"与中文乱码
    查看>>
    Python 字符串的几种拼装方式
    查看>>
    python 存入数据库bigint_python基础_MySQL的bigint类型
    查看>>
    python 学习 面向对象编程
    查看>>
    Python 学习小结
    查看>>
    Python 学习日记第三篇 -- 字典
    查看>>