Python实现堆排序的方法详解

 更新时间:2016年05月03日 11:40:13   作者:阿涵-_-  
这篇文章主要介绍了Python实现堆排序的方法,结合实例形式详细分析了堆排序的原理,实现方法与相关注意事项,需要的朋友可以参考下

本文实例讲述了Python实现堆排序的方法。分享给大家供大家参考,具体如下:

堆排序作是基本排序方法的一种,类似于合并排序而不像插入排序,它的运行时间为O(nlogn),像插入排序而不像合并排序,它是一种原地排序算法,除了输入数组以外只占用常数个元素空间。

堆(定义):(二叉)堆数据结构是一个数组对象,可以视为一棵完全二叉树。如果根结点的值大于(小于)其它所有结点,并且它的左右子树也满足这样的性质,那么这个堆就是大(小)根堆。

我们假设某个堆由数组A表示,A[1]为树的根,给定某个结点的下标i,其父结点、左孩子、右孩子的下标都可以计算出来:

PARENT(i):
    return i/2
LEFT(i):
    return 2i
RIGHT(i):
    return 2i+1

堆排序Python实现

所谓堆排序的过程,就是把一些无序的对象,逐步建立起一个堆的过程。
下面是用Python实现的堆排序的代码:

def build_max_heap(to_build_list):
  """建立一个堆"""
  # 自底向上建堆
  for i in range(len(to_build_list)/2 - 1, -1, -1):
    max_heap(to_build_list, len(to_build_list), i)
def max_heap(to_adjust_list, heap_size, index):
  """调整列表中的元素以保证以index为根的堆是一个最大堆"""
  # 将当前结点与其左右子节点比较,将较大的结点与当前结点交换,然后递归地调整子树
  left_child = 2 * index + 1
  right_child = left_child + 1
  if left_child < heap_size and to_adjust_list[left_child] > to_adjust_list[index]:
    largest = left_child
  else:
    largest = index
  if right_child < heap_size and to_adjust_list[right_child] > to_adjust_list[largest]:
    largest = right_child
  if largest != index:
    to_adjust_list[index], to_adjust_list[largest] = \
    to_adjust_list[largest], to_adjust_list[index]
    max_heap(to_adjust_list, heap_size, largest)
def heap_sort(to_sort_list):
  """堆排序"""
  # 先将列表调整为堆
  build_max_heap(to_sort_list)
  heap_size = len(to_sort_list)
  # 调整后列表的第一个元素就是这个列表中最大的元素,将其与最后一个元素交换,然后将剩余的列表再调整为最大堆
  for i in range(len(to_sort_list) - 1, 0, -1):
    to_sort_list[i], to_sort_list[0] = to_sort_list[0], to_sort_list[i]
    heap_size -= 1
    max_heap(to_sort_list, heap_size, 0)
if __name__ == '__main__':
  to_sort_list = [4, 1, 3, 2, 16, 9, 10, 14, 8, 7]
  heap_sort(to_sort_list)
  print to_sort_list

更多关于Python相关内容可查看本站专题:《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总

希望本文所述对大家Python程序设计有所帮助。

相关文章

  • Python实现提取音乐频谱的方法详解

    Python实现提取音乐频谱的方法详解

    你有没有经常好奇一些音乐软件的频谱特效是怎么做的,为什么做的这么好看?有没有想试试自己提取音乐频谱并可视化展现出来?本文就来教你如何利用Python提取音乐频谱,快来学习一下吧
    2022-06-06
  • python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】

    python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】

    这篇文章主要介绍了Pycharm 新建模板默认添加编码格式-作者-时间等信息 ,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • Django框架安装方法图文详解

    Django框架安装方法图文详解

    这篇文章主要介绍了Django框架安装方法,结合图文与实例形式详细分析了Django框架的下载、安装简单使用方法及相关操作注意事项,需要的朋友可以参考下
    2019-11-11
  • Flask利用自定义接口实现mock应用详解

    Flask利用自定义接口实现mock应用详解

    后端接口已提供,前端需要依赖后端接口返回的数据进行前端页面的开发,如何配合前端?这篇就来介绍一下Flask如何利用自定义接口实现mock应用,需要的可以参考一下
    2023-03-03
  • Python 为什么推荐蛇形命名法原因浅析

    Python 为什么推荐蛇形命名法原因浅析

    这篇文章主要介绍了Python 为什么推荐蛇形命名法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • python中的torch常用tensor处理函数示例详解

    python中的torch常用tensor处理函数示例详解

    这篇文章主要介绍了python中的torch常用tensor处理函数,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Flask搭建一个API服务器的步骤

    Flask搭建一个API服务器的步骤

    Flask真是一个强大且简介的web框架,能够快速搭建web服务器,本文主要介绍了Flask搭建一个API服务器的步骤,分享给大家,感兴趣的可以了解一下
    2021-05-05
  • 基于Python实现视频去重小工具

    基于Python实现视频去重小工具

    这篇文章主要为大家详细介绍了如何通过Python语言编写简单的视频去重小工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起尝试一下
    2023-03-03
  • Python hashlib模块的使用示例

    Python hashlib模块的使用示例

    这篇文章主要介绍了Python hashlib模块的相关资料,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-10-10
  • Pipenv一键搭建python虚拟环境的方法

    Pipenv一键搭建python虚拟环境的方法

    这篇文章主要介绍了Pipenv一键搭建python虚拟环境的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05

最新评论