博客
关于我
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 中的带宽限制
    查看>>
    Python 中的机器学习简介:多项式回归
    查看>>
    python读取grib2数据_用Python加载grib2文件
    查看>>
    Python 中的注意点_s2
    查看>>
    Python读取Excel的几种工具包(附Demo)
    查看>>
    Python 中的生成器是什么?
    查看>>
    Python 中的离线语音转文本
    查看>>
    Python读写json文件的简单实现
    查看>>
    Python 中的线程
    查看>>
    Python 中的继承机制是什么样的?
    查看>>
    python读写excel之xlrd&xlwt&xlutils组合
    查看>>
    Python 中的装饰器是什么?
    查看>>
    Python 中的装饰器是如何工作的,有哪些实际应用场景?
    查看>>
    python读excel
    查看>>
    Python 中读取 CSV 文件-ChatGPT4o作答
    查看>>
    Python 之 filecmp
    查看>>
    python请求html_使用Python请求获取HTML?
    查看>>
    Python 之匿名函数和偏函数
    查看>>
    python 之栈的实现
    查看>>
    python语音播放
    查看>>