class HeapStructure:
def __init__(self, ls):
self.ls = ls def shift_up(self, index): # 上移使符合堆要求
if index == 0:
return
ls = self.ls
par_index = (index - 1) // 2
if ls[par_index] < ls[index]:
ls[par_index], ls[index] = ls[index], ls[par_index]
self.shift_up(index-1) def shift_down(self, index, last_index): # 下移使符合堆要求
ls = self.ls
child_left, child_right = 2 * index + 1, 2 * index + 2
if child_left > last_index:
return
if child_left < last_index and ls[child_left] < ls[child_right]:
if ls[index] < ls[child_right]: # 与右子节点交换
ls[index], ls[child_right] = ls[child_right], ls[index]
self.shift_down(child_right, last_index)
else:
if ls[index] < ls[child_left]: # 与左子节点交换
ls[index], ls[child_left] = ls[child_left], ls[index]
self.shift_down(child_left, last_index) def sort(self):
i = len(self.ls)
if i == 0:
return self.ls
last_index = i - 1
self.shift_up(last_index) # 变为最大堆
self.ls[0], self.ls[last_index] = self.ls[last_index], self.ls[0] # 最大值移动到队尾
last_index -= 1
while last_index:
self.shift_down(0, last_index=last_index) # 调整为最大堆
self.ls[0], self.ls[last_index] = self.ls[last_index], self.ls[0]
last_index -= 1
return self.ls if __name__ == '__main__':
ls = [5, 1, 2, 4, 8, 0, 9]
print(HeapStructure(ls).sort())
ls = []
print(HeapStructure(ls).sort())

使用PYTHON完成排序(堆排序)的更多相关文章

  1. python常见排序算法解析

    python——常见排序算法解析   算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...

  2. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  3. Python实现排序算法之快速排序

    Python实现排序算法:快速排序.冒泡排序.插入排序.选择排序.堆排序.归并排序和希尔排序 Python实现快速排序 原理 首先选取任意一个数据(通常选取数组的第一个数)作为关键数据,然后将所有比它 ...

  4. python 经典排序算法

    python 经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算 ...

  5. 用python编写排序算法

    交换排序 === 冒泡排序,快速排序 插入排序 ===直接插入排序,希尔排序 选择排序 === 简单选择排序,堆排序 归并排序 基数排序 冒泡排序 要点 冒泡排序是一种交换排序. 什么是交换排序呢? ...

  6. python sorted排序

    python sorted排序 Python不仅提供了list.sort()方法来实现列表的排序,而且提供了内建sorted()函数来实现对复杂列表的排序以及按照字典的key和value进行排序. s ...

  7. python 常见排序实例

    使用Python 基础排序算法设计,冒泡排序,插入排序,快速排序... 需求 对一组无序数据进行排序算法设计,要求如下: 输入:[1, 3, 5, 23, 75, 34, 456, 86, 22, 7 ...

  8. Python的排序

    1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a','have','I' ...

  9. python 字典排序 关于sort()、reversed()、sorted()

    一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a ...

  10. 排序 选择排序&&堆排序

    选择排序&&堆排序 1.选择排序: 介绍:选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始 ...

随机推荐

  1. DAO(Repository),Service,Controller层之间的相互关系

    DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口 ...

  2. 实现ls-l功能

    实现代码 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <diren ...

  3. 安装和破解Navicat

    这里的是安装目录,要记住 额外热任务在桌面创建一个快捷方式 点击完成之后先不要打开运行Navicat.exe这个主程序,把PatchNavicat.exe复制到你刚刚我们安装的路径,,不是你安装包的路 ...

  4. Cent OS 6.4下安装JDK1.6

    步骤1:查看Linux自带的JDK是否已安装 (卸载CentOS已安装的JDK)  安装好的CentOS会自带OpenJDK,用命令"java -version"查看,会有下面的信 ...

  5. 使用phxpaxos开发过程中遇到的坑

    1. 开启BatchPropose后,状态机使用ExecuteForCheckpoint生成快照要注意: ExecuteForCheckpoint中的InstanceID不能立即持久化. 例如: 当i ...

  6. std::condition_variable::wait_until segment

    原因是使用了 -static 改为 -static-libstdc++ -static-libgcc

  7. 吴裕雄 python 机器学习——分类决策树模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.model_s ...

  8. 吴裕雄 python 机器学习——回归决策树模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.model_s ...

  9. Homework:工作日 还是周末

    /* 程序功能: 要求用户从键盘输入1~7之间的整数 如果输入的是1~5, 提示用户是工作日,要努力工作: 如果输入的是6或7,提示用户是休息日,放松休息: 否则,提示用户输入不在合法范围 */ #i ...

  10. yii2.0 url美化-apache服务器

    //配置内容 'urlManager' => [ 'enablePrettyUrl' => true, 'enableStrictParsing' => false, //不启用严格 ...