排序算法-06堆排序(python实现)
堆排序
- 简介
- 经典的选择排序,实现利用了二叉树这样的数据结构。
算法实现
- 预备知识
- 堆是一棵顺序存储的完全二叉树。(若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。)
- 完全二叉树(左)与非完全二叉树(右)
- 其中每个结点的值都不大于其孩子结点的关键字,这样的堆称为小顶堆;其中每个结点的值都不小于其孩子结点的关键字,这样的堆称为大顶堆。
- 顺序存储的二叉树可以通过当前元素下标得到其父结点、兄弟结点、孩子结点,这里不做数学关系的推导了。
- 排序过程
- 根据数据构造二叉树,调整二叉树使之成为大顶堆(从最后一个节点开始,不断修改,使得孩子总是不大于父亲结点。)
- 每次排序交换第一个和最后一个元素,输出最后一个值,剩余元素重新调整为大顶堆。重复上述步骤。
复杂度分析
排序名称 最好情况 最坏情况 平均情况 堆排序 O(nlogn) O(nlogn) O(nlogn) - 稳定性
- 该算法不稳定。
- 预备知识
# -*- coding:utf-8 -*-
'''
本模块实现一维数据的堆排序
'''def HeapSort(data=[1, 2, 3, 4, 5]):def HeapAdjust(data, parent, length):'''调整为大顶堆:param data: 数据序列:param parent: 堆的父结点:param length: 数组长度:return:'''temp = data[parent]child = 2 * parent + 1while child <length:if child + 1 < length and data[child] < data[child+1]:child += 1if temp >= data[child]:breakdata[parent] = data[child]parent = childchild = 2 * parent + 1data[parent] = templength = len(data)for i in range(0, length//2)[::-1]:HeapAdjust(data, i, length)for j in range(1, length)[::-1]:data[j], data[0] = data[0], data[j]HeapAdjust(data, 0, j)print("第{}趟排序:".format(length-j), data)return Noneif __name__ == '__main__':testData = [6, 4, 8, 9, 5, 2, 3, 1]HeapSort(testData)
具体可以查看我的github。
排序算法-06堆排序(python实现)相关推荐
- 排序算法(五)——堆排序算法详解及Python实现
本文目录 一.简介 二.算法介绍 三.代码实现 排序算法系列--相关文章 一.简介 堆排序(Heap Sort)算法,属于选择排序类,不稳定排序,时间复杂度O(nlogn). 堆排序由Floyd和Wi ...
- 【代码刷题】排序算法总结(python实现)
排序算法总结(Python实现) 算法介绍 算法分类 相关概念 1. 冒泡排序(Bubble Sort) 1.1 思想 1.2 python实现 1.3 复杂度 1.4 稳定性 2. 快速排序(Qui ...
- 经典排序算法总结与Python实现(下)
在之前的博客经典排序算法总结与Python实现(上)中已经讨论过插入.冒泡.选择.快排.谢尔排序.这篇博客主要完成剩下的几个排序算法. 排序算法 时间复杂度(最好) 时间复杂度(最差) 时间复杂度(平 ...
- 十大排序算法之堆排序
十大排序算法之堆排序 本文采用Java书写选择排序,其他语言类似可以借鉴着写 思想:所谓堆排序就是通过构造最大堆(升序)或者最小堆(降序)来进行排列的方法.可能有些童鞋不知道何为最大堆,何为最小堆.这 ...
- Java常见排序算法之堆排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- 排序算法之---堆排序(很重要的一个结构,新手入门必备)
排序算法之---堆排序(很重要的一个结构,新手入门必备) 先来简单的介绍一下堆结构: 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlo ...
- 经典排序算法总结与Python实现(上)
本篇博客中的有序都是指的升序,降序情况稍微改改就出来了. 排序算法 时间复杂度(最好) 时间复杂度(最差) 时间复杂度(平均) 空间复杂度 稳定性 插入排序 O(n)O(n)O(n) O(n2)O(n ...
- 数据结构与算法:十大排序算法之堆排序
数据结构与算法:十大排序算法之堆排序 堆排序可以说是选择排序的优化 package TopTenSortingAlgorithms;import java.util.Arrays; import ja ...
- 排序算法(6)堆排序
排序算法(6)堆排序---选择排序的高级版 思想:利用数据结构堆的思想来排序,堆排序利用了大堆(或小堆)堆顶记录的关键字最大(或最小)这一特征,使得当前无序的序列中选择关键最大(或最小)的记录变得简单 ...
最新文章
- nopi设置excel只读
- 扫盲行动之九:Vi编辑器的基本使用方法!
- 查询oracle数据库adg的模式,Oracle11g ADG配置
- mysql 删除另一个表中的_mysql – 在一个查询SQL中删除两个表中的记录
- Mysql截取中英数混合的字符串
- jsp 跳到servlet路径_请问如何从jsp中跳到servlet中?
- SR-IOV(Single Root I/O Virtualization):将PCIe共享给虚拟机的标准
- php mysql某值相同时_php - Mysql3个字段,任何一个字段的值相同则为重复,语句应该怎么写?...
- cout不明确什么意思_年轻人不讲武德是什么梗和意思 年轻人不讲武德梗出处
- implode - of an array
- spring mvc 4.3.2 + mybatis 3.4.1 + mysql 5.7.14 +shiro 幼儿园收费系统 之 消息管理
- 遗传算法及c++实现
- viewstub学习笔记
- 增强网络安全意识——如何5分钟破解校园网上网账号和密码
- php 触摸键盘,window_Win10正式版新增键盘快捷键和触摸手势汇总篇, 微软在新一代操作系统Win1 - phpStudy...
- checkSelfPermission总是返回PERMISSION_GRANTED
- python 爬虫1
- 单片机c语言编写音乐播放器,51单片机c语言编写电子琴+音乐播放器.doc.doc
- 解决import cv2找不到指定模块问题
- 面试一脸懵:使用promise改造旧异步函数