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

堆排序的思想:堆是一种数据结构,可以将堆看作一棵完全二叉树,这棵二叉树满足,任何一个非叶节点的值都不大于(或不小于)其左右孩子节点的值。 将一个无序序列调整为一个堆,就可以找出这个序列的最大值(或最小值),然后将找出的这个值交换到序列的最后一个,这样有序序列就元素就增加一个,无序序列元素就减少一个,对新的无序序列重复这样的操作,就实现了排序。

堆排序的执行过程:

1.从无序序列所确定的完全二叉树的第一个非叶子节点开始,从右至左,从下至上,对每个节点进行调整,最终将得到一个大顶堆。

对节点的调整方法:将当前节点(假设为a)的值与其孩子节点进行比较,如果存在大于a的值的孩子节点,则从中选出最大的一个与a交换。当a来到下一层的时候重复上述过程,直到a的孩子节点的值都小于a为止

2.将当前无序序列中的第一个元素(反映在数中是根节点b),与无序序列中的最后一个元素交换(假设为c),b进入有序序列,到达最终位置。无序序列元素减少1个,有序序列元素增加1个,此时只有节点c可能不满足堆的定义,对其进行调整。

3.重复2 的过程,直到无序序列的元素剩下一个时排序结束。

# -*- coding:utf-8 -*-

# 堆排序适用于记录数很多的情况

from collections import deque

# 这里需要说明元素的存储必须要从1开始

# 涉及到左右节点的定位,和堆排序开始调整节点的定位

# 在下标0处插入0,它不参与排序

L = deque([49,38,65,97,76,13,27,49])

L.appendleft(0)

#L = [0,49,38,65,97,76,13,27,49]

def element_exchange(numbers,low,high):

temp = numbers[low]

# j 是low的左孩子节点(cheer!)

i = low

j = 2*i

while j<=high:

# 如果右节点较大,则把j指向右节点

if j

j = j+1

if temp

# 将numbers[j]调整到双亲节点的位置上

numbers[i] = numbers[j]

i = j

j = 2*i

else:

break

# 被调整节点放入最终位置

numbers[i] = temp

def top_heap_sort(numbers):

length = len(numbers)-1

# 指定第一个进行调整的元素的下标

# 它即该无序序列完全二叉树的第一个非叶子节点

# 它之前的元素均要进行调整

# cheer up!

first_exchange_element = length/2

#建立初始堆

print first_exchange_element

for x in range(first_exchange_element):

element_exchange(numbers,first_exchange_element-x,length)

# 将根节点放到最终位置,剩余无序序列继续堆排序

# length-1 次循环完成堆排序

for y in range(length-1):

temp = numbers[1]

numbers[1] = numbers[length-y]

numbers[length-y] = temp

element_exchange(numbers,1,length-y-1)

if __name__=='__main__':

top_heap_sort(L)

for x in range(1,len(L)):

print L[x],

运行结果:

PS:这里再为大家推荐一款关于排序的演示工具供大家参考:

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

python实现堆排序算法_Python实现的堆排序算法示例相关推荐

  1. python决策树分类案例_python实现决策树分类算法

    本文实例为大家分享了python实现决策树分类算法的具体代码,供大家参考,具体内容如下 1.概述 决策树(decision tree)--是一种被广泛使用的分类算法. 相比贝叶斯算法,决策树的优势在于 ...

  2. python数圈算法_Python实现随机爬山算法

    随机爬山是一种优化算法.它利用随机性作为搜索过程的一部分.这使得该算法适用于非线性目标函数,而其他局部搜索算法不能很好地运行.它也是一种局部搜索算法,这意味着它修改了单个解决方案并搜索搜索空间的相对局 ...

  3. python实现排序算法_python实现各种排序算法

    冒泡排序 """ 分析 1. 算法是一种与语言无关的东西,更确切地说就算解决问题的思路,就是一个通用的思想的问题 2. 冒泡算法作为最简单的一种排序算法,我们的关注点不应 ...

  4. pythonopencv算法_python opencv之SURF算法示例

    本文介绍了python opencv之SURF算法示例,分享给大家,具体如下: 目标: SURF算法基础 opencv总SURF算法的使用 原理: 上节课使用了SIFT算法,当时这种算法效率不高,需要 ...

  5. python连接redis哨兵_Python redis.sentinel方法代码示例

    本文整理汇总了Python中redis.sentinel方法的典型用法代码示例.如果您正苦于以下问题:Python redis.sentinel方法的具体用法?Python redis.sentine ...

  6. python程序异常实例_Python werkzeug.exceptions方法代码示例

    本文整理汇总了Python中werkzeug.exceptions方法的典型用法代码示例.如果您正苦于以下问题:Python werkzeug.exceptions方法的具体用法?Python wer ...

  7. python列表get方法_Python json.get方法代码示例

    本文整理汇总了Python中json.get方法的典型用法代码示例.如果您正苦于以下问题:Python json.get方法的具体用法?Python json.get怎么用?Python json.g ...

  8. python modifysetup什么意思_Python pyinotify.IN_MODIFY属性代码示例

    本文整理汇总了Python中pyinotify.IN_MODIFY属性的典型用法代码示例.如果您正苦于以下问题:Python pyinotify.IN_MODIFY属性的具体用法?Python pyi ...

  9. python re 简单实例_Python re.search方法代码示例

    本文整理汇总了Python中re.search方法的典型用法代码示例.如果您正苦于以下问题:Python re.search方法的具体用法?Python re.search怎么用?Python re. ...

最新文章

  1. SQL的top 100 percent用法
  2. linux下vim 打开文件方式
  3. python守护线程错误 退出子线程_请问用python里threading和queue模块来写多线程程序,子线程是如何结束的?...
  4. MongoCola使用教程 1 - MongoDB的基本操作和聚合功能
  5. 潭州课堂25班:Ph201805201 tornado 项目 第八课 增加喜欢功能(课堂笔记)
  6. seafile看不见repo报500错误的解决方法
  7. Linux拷贝分区内容,dd复制分区后目标分区的大小变成原分区了
  8. 安卓ViewFlipper跑马灯效果
  9. django网页倒计时(完整代码,下载即可运行)
  10. 大起底神盾七号重疾险:赔两次价格还不贵,到底值不值?
  11. 亚马逊、速卖通、东南亚等跨境电商平台2022年最新测评自养号系统
  12. 系统集成项目管理工程师10大管理47个过程域输入输出工具(项目整体管理)
  13. active英语怎么读音_inactive,inactive的英文意思和翻译,inactive的音标读音,用法,例句,发音,含义讲解...
  14. c语言数据块写入函数,C语言数据块读写函数:fread和fwrite
  15. @on-change 事件无法触发解决方案
  16. static应用知识:代码块
  17. 【NOIP_模拟题】survive
  18. js求三个数的最大值和最小值
  19. 易编远航第三期第3套 穿越火线CF辅助开发实战
  20. 无线通信:Wi-Fi 基本知识

热门文章

  1. Zoom:1 是什么鬼?有什么作用?
  2. cad刷新快捷键_纯干货|CAD口诀
  3. 构建工具fis3的使用
  4. 自建公有dns服务器,自建dns服务器的必要性
  5. python捕获异常 主动抛出异常
  6. 烤仔观察 | BTC何去何从,萨尔瓦多知道答案
  7. 跨设备设计基础 | 如何确定任意屏幕的分辨率指标
  8. 链表栈 一 二叉搜索树 一 深度优先之前序遍历
  9. Python02:加密py文件
  10. Python随笔:改变Windows中 pip 的缓存位置与删除 pip 缓存