Python实现堆排序的方法详解

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

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

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

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

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

Python实现堆排序的方法详解

立即学习“Python免费学习笔记(深入)”;

堆排序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  to_adjust_list[index]:    largest = left_child  else:    largest = index  if 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程序设计有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2536484.html

(0)
上一篇 2025年3月5日 23:32:33
下一篇 2025年3月3日 18:45:49

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • python脚本监控docker容器

    本文实例为大家分享了python脚本监控docker容器的方法,供大家参考,具体内容如下 脚本功能: 1、监控CPU使用率 2、监控内存使用状况 3、监控网络流量 立即学习“Python免费学习笔记(深入)”; 具体代码: #!/usr/b…

    编程技术 2025年3月5日
    200
  • Python松散正则表达式用法分析

    本文实例讲述了python松散正则表达式用法。分享给大家供大家参考,具体如下: Python 允许用户利用所谓的 松散正则表达式来完成这个任务。一个松散正则表达式和一个紧凑正则表达式主要区别表现在两个方面: 1. 忽略空白符。空格符,制表符…

    编程技术 2025年3月5日
    200
  • Python多进程同步简单实现代码

    本文讲述了python多进程同步简单实现代码。分享给大家供大家参考,具体如下: #encoding=utf8from multiprocessing import Process, Lockdef func(lock, a): lock.a…

    编程技术 2025年3月5日
    200
  • python中私有函数调用方法解密

    本文实例讲述了python中私有函数调用方法。分享给大家供大家参考,具体如下: 与大多数语言一样,Python 也有私有的概念: ① 私有函数不可以从它们的模块外面被调用② 私有类方法不能够从它们的类外面被调用③ 私有属性不能够从它们的类外…

    编程技术 2025年3月5日
    200
  • Python对象转JSON字符串的方法

    本文实例讲述了python对象转json字符串的方法。分享给大家供大家参考,具体如下: import jsonclass JSONObject(object): def __init__(self): self.name = ‘Ahan’ …

    编程技术 2025年3月5日
    200
  • 简单学习Python time模块

    本文针对python time模块进行分类学习,希望对大家的学习有所帮助。 一.壁挂钟时间 1.time() time模块的核心函数time(),它返回纪元开始的秒数,返回值为浮点数,具体精度依赖于平台。 >>>impor…

    编程技术 2025年3月5日
    200
  • Python简单实现TCP包发送十六进制数据的方法

    本文实例讲述了python简单实现tcp包发送十六进制数据的方法。分享给大家供大家参考,具体如下: 举例: 0x12, 0x34可以直接拼成 “4”。 客户端代码示例: #-*- encoding: utf-8 -*…

    编程技术 2025年3月5日
    200
  • Python数组定义方法

    本文实例讲述了python数组定义方法。分享给大家供大家参考,具体如下: Python中没有数组的数据结构,但列表很像数组,如: a=[0,1,2] 登录后复制 这时:a[0]=0, a[1]=1, a[[2]=2,但引出一个问题,即如果数…

    编程技术 2025年3月5日
    200
  • Python出现segfault错误解决方法

    本文分析了python出现segfault错误解决方法。分享给大家供大家参考,具体如下: 最近python程序在运行过程中偶尔会引发系统segfault的错误,而且是在不定期不同代码段时发生的,所以单步调试没办法确定是哪一行代码的问题。 段…

    编程技术 2025年3月5日
    200
  • Python基于select实现的socket服务器

    本文实例讲述了python基于select实现的socket服务器。分享给大家供大家参考,具体如下: 借鉴了asyncore模块中select.select的使用方法 import socketimport tracebackimport …

    编程技术 2025年3月5日
    100

发表回复

登录后才能评论