堆排序

  • 简介

    • 经典的选择排序,实现利用了二叉树这样的数据结构。
  • 算法实现

    • 预备知识

      • 堆是一棵顺序存储的完全二叉树。(若设二叉树的深度为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实现)相关推荐

  1. 排序算法(五)——堆排序算法详解及Python实现

    本文目录 一.简介 二.算法介绍 三.代码实现 排序算法系列--相关文章 一.简介 堆排序(Heap Sort)算法,属于选择排序类,不稳定排序,时间复杂度O(nlogn). 堆排序由Floyd和Wi ...

  2. 【代码刷题】排序算法总结(python实现)

    排序算法总结(Python实现) 算法介绍 算法分类 相关概念 1. 冒泡排序(Bubble Sort) 1.1 思想 1.2 python实现 1.3 复杂度 1.4 稳定性 2. 快速排序(Qui ...

  3. 经典排序算法总结与Python实现(下)

    在之前的博客经典排序算法总结与Python实现(上)中已经讨论过插入.冒泡.选择.快排.谢尔排序.这篇博客主要完成剩下的几个排序算法. 排序算法 时间复杂度(最好) 时间复杂度(最差) 时间复杂度(平 ...

  4. 十大排序算法之堆排序

    十大排序算法之堆排序 本文采用Java书写选择排序,其他语言类似可以借鉴着写 思想:所谓堆排序就是通过构造最大堆(升序)或者最小堆(降序)来进行排列的方法.可能有些童鞋不知道何为最大堆,何为最小堆.这 ...

  5. Java常见排序算法之堆排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  6. 排序算法之---堆排序(很重要的一个结构,新手入门必备)

    排序算法之---堆排序(很重要的一个结构,新手入门必备) 先来简单的介绍一下堆结构: 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlo ...

  7. 经典排序算法总结与Python实现(上)

    本篇博客中的有序都是指的升序,降序情况稍微改改就出来了. 排序算法 时间复杂度(最好) 时间复杂度(最差) 时间复杂度(平均) 空间复杂度 稳定性 插入排序 O(n)O(n)O(n) O(n2)O(n ...

  8. 数据结构与算法:十大排序算法之堆排序

    数据结构与算法:十大排序算法之堆排序 堆排序可以说是选择排序的优化 package TopTenSortingAlgorithms;import java.util.Arrays; import ja ...

  9. 排序算法(6)堆排序

    排序算法(6)堆排序---选择排序的高级版 思想:利用数据结构堆的思想来排序,堆排序利用了大堆(或小堆)堆顶记录的关键字最大(或最小)这一特征,使得当前无序的序列中选择关键最大(或最小)的记录变得简单 ...

最新文章

  1. nopi设置excel只读
  2. 扫盲行动之九:Vi编辑器的基本使用方法!
  3. 查询oracle数据库adg的模式,Oracle11g ADG配置
  4. mysql 删除另一个表中的_mysql – 在一个查询SQL中删除两个表中的记录
  5. Mysql截取中英数混合的字符串
  6. jsp 跳到servlet路径_请问如何从jsp中跳到servlet中?
  7. SR-IOV(Single Root I/O Virtualization):将PCIe共享给虚拟机的标准
  8. php mysql某值相同时_php - Mysql3个字段,任何一个字段的值相同则为重复,语句应该怎么写?...
  9. cout不明确什么意思_年轻人不讲武德是什么梗和意思 年轻人不讲武德梗出处
  10. implode - of an array
  11. spring mvc 4.3.2 + mybatis 3.4.1 + mysql 5.7.14 +shiro 幼儿园收费系统 之 消息管理
  12. 遗传算法及c++实现
  13. viewstub学习笔记
  14. 增强网络安全意识——如何5分钟破解校园网上网账号和密码
  15. php 触摸键盘,window_Win10正式版新增键盘快捷键和触摸手势汇总篇,  微软在新一代操作系统Win1 - phpStudy...
  16. checkSelfPermission总是返回PERMISSION_GRANTED
  17. python 爬虫1
  18. 单片机c语言编写音乐播放器,51单片机c语言编写电子琴+音乐播放器.doc.doc
  19. 解决import cv2找不到指定模块问题
  20. 面试一脸懵:使用promise改造旧异步函数

热门文章

  1. 多租户(multi-tenant)
  2. 数据库事务原理详解-事务的嵌套
  3. 悔不当初:回顾进化之路
  4. Oracle之同义词,DBLINK,表空间
  5. ActiveMQ专题
  6. Spring ribbon
  7. 【小题目】判断一个数字是否是3的倍数
  8. C语言基本类型和存储类别
  9. EFCore笔记之异步查询
  10. parseInt和parseFloat(转换成数字,提取成数字)?