堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好的,平均时间复杂度为O(nlogn),它也不是不稳定排序。

1.堆的介绍
堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图

同时,我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子

该数组从逻辑上讲就是一个堆结构,我们用简单的公式来描述一下堆的定义就是:

  • 大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]
  • 小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]

2.堆排序基本思想及步骤
堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了

步骤一 构造初始堆。将给定无序序列构造成一个大顶堆(一般升序采用大顶堆,降序采用小顶堆)。

a.假设给定无序序列结构如下

b.此时我们从最后一个非叶子结点开始(叶结点自然不用调整,第一个非叶子结点 arr.length/2-1=5/2-1=1,也就是下面的6结点),从左至右,从下至上进行调整。

c.找到第二个非叶节点4,由于[4,9,8]中9元素最大,4和9交换。

这时,交换导致了子根[4,5,6]结构混乱,继续调整,[4,5,6]中6最大,交换4和6。

此时,我们就将一个无需序列构造成了一个大顶堆。

步骤二 将堆顶元素与末尾元素进行交换,使末尾元素最大。然后继续调整堆,再将堆顶元素与末尾元素交换,得到第二大元素。如此反复进行交换、重建、交换

a.将堆顶元素9和末尾元素4进行交换
b.重新调整结构,使其继续满足堆定义

c.再将堆顶元素8与末尾元素5进行交换,得到第二大元素8.

后续过程,继续进行调整,交换,如此反复进行,最终使得整个序列有序

再简单总结下堆排序的基本思路:a.将无需序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;b.将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;c.重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。

def sift(li,low,high):'''Parameters----------li : 列表low : 堆的根节点位置high : 堆的最后一个元素的位置Returns: 大根堆-------'''i = low # i最开始指向指向根节点j = 2*i + 1 # j开始指向i的左孩子tmp = li[low] # 把堆顶存起来while j <= high: # j位置有数存在if j + 1 <= high and li[j+1] > li[j]: # 如果右孩子存在,且比左孩子大j = j + 1 # j改为指向右孩子if li[j] > tmp: # 堆顶的值与孩子的值比较li[i] = li[j] # 将孩子的值赋予给堆顶i = j # 堆顶和下面的值进行比较j = 2*i + 1else: # 如果tmp的值更大li[i] = tmp # 把tmp放到某一个领导位置上breakelse:li[i] = tmp # 把tmp放到叶子节点上def heap_sort(li):n = len(li)for i in range((n-2)//2,-1,-1):# i表示建堆的时候调整的部分根下标,使其满足大根堆的形式sift(li,i,n-1)# 建堆完成for i in range(n-1,-1,-1):# i 指向当前堆的最后一个元素li[0],li[i] = li[i],li[0]sift(li,0,i-1) # i-1是新的highli = [i for i in range(10)]
import random
random.shuffle(li)
print(li)
heap_sort(li)
print(li)

python内置堆函数

import heapq
import randomli = list(range(10))
random.shuffle(li)
print(li)heapq.heapify(li) # 建堆n = len(li)
for i in range(n):print(heapq.heappop(li),end=',')

堆排序(heap sort)相关推荐

  1. Python入门篇-数据结构堆排序Heap Sort

    Python入门篇-数据结构堆排序Heap Sort 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.堆Heap 堆是一个完全二叉树每个非叶子结点都要大于或者等于其左右孩子结点的 ...

  2. C语言堆排序Heap Sort算法(附完整源码)

    堆排序Heap Sort算法 堆排序Heap Sort算法的完整源码(定义,实现,main函数测试) 堆排序Heap Sort算法的完整源码(定义,实现,main函数测试) #include < ...

  3. 经典排序算法 - 堆排序Heap sort

    经典排序算法 - 堆排序Heap sort 堆排序有点小复杂,分成三块 第一块,什么是堆,什么是最大堆 第二块,怎么将堆调整为最大堆,这部分是重点 第三块,堆排序介绍 第一块,什么是堆,什么是最大堆 ...

  4. 堆排序 Heap Sort

  5. PAT甲级1098 Insertion or Heap Sort:[C++题解]堆排序和插入排序

    文章目录 题目分析 题目链接 题目分析 分析 插入排序的特点:前半部分有序,后半部分保持原序. 堆排序的特点: 后半部分有序,前半部分无序. 本题的bug在于,答案是唯一的,即不是插入排序就是堆排序, ...

  6. C语言实现heap sort堆排序的算法(附完整源码)

    C语言实现heap sort堆排序的算法 C语言实现heap sort堆排序的算法完整源码(定义,实现,main函数测试) C语言实现heap sort堆排序的算法完整源码(定义,实现,main函数测 ...

  7. C++Heap Sort堆排序的实现算法(附完整源码)

    C++Heap Sort堆排序的实现算法 C++Heap Sort堆排序的实现算法完整源码(定义,实现,main函数测试) C++Heap Sort堆排序的实现算法完整源码(定义,实现,main函数测 ...

  8. 1098 Insertion or Heap Sort 需再做

    1. 应该还做过一道类似的题目,也是要求判断属于哪种排序的中间过程,并要求写出下一轮排序结果,这次的进步是上来就知道用向量存数据,这样方便直接比较,而且下标0不能存元素,因为堆排序的堆是一个完全二叉树 ...

  9. 排序算法之 Heap Sort

    Heap Sort (cpp_heap_sort.cc) ======================================================================= ...

  10. PAT A1098 Insertion or Heap Sort

    1098 Insertion or Heap Sort 分数 25 作者 CHEN, Yue 单位 浙江大学 According to Wikipedia: Insertion sort iterat ...

最新文章

  1. python numpy.mean() axis参数使用方法【sum(axis=*)是求和,mean(axis=*)是求平均值】
  2. vue组件间函数调用
  3. Kubernetes 入门:运行不同类型的 Job
  4. 《python透明人士,他是凭什么成为主流编程的宠儿?!》python基础语法
  5. Spark报错: Invalid Spark URL: spark://YarnScheduler@stream_test_nb:40659
  6. 无锡 计算机学校排名,无锡中职学校有哪些 前20排名
  7. 纵观 30 年 5000 多部国产电视剧,豆瓣评分最低的演员原来是……
  8. day05_日常SQL练习(一)
  9. Sample DataBase 资源
  10. 固态硬盘分为哪几种_固态硬盘分类简介和选择
  11. 注册表被禁用了怎么办?
  12. 远程计算机蓝屏,什么原因造成了蓝屏 电脑蓝屏错误代码介绍
  13. 2022年软件测试人员必读的经典书籍推荐(附电子版)
  14. CG Tools 工具收集
  15. HTML+CSS美食静态网页设计——简单牛排美食餐饮(9个页面)公司网站模板企业网站实现
  16. 亿起发网站主获取CPS数据接口说明
  17. 微信支付(2)---测试用例
  18. IDEA中类的图标变成J
  19. 《智能步态识别门禁系统》,基于深度学习的多人步态识别系统
  20. win10下pip安装tensorflow-gpu遇到的问题

热门文章

  1. JS中的call()和apply()方法
  2. 互联网企业招聘零分考生 扇了谁的耳光?
  3. 【DFS】LeetCode 40. Combination Sum II
  4. 从王者荣耀看设计模式(一.策略模式)
  5. JavaScript Break 和 Continue 语句
  6. SUSE12SP3-Mycat(2)Schema.xml配置详解
  7. tomcat ---- 启动,关闭和配置等等
  8. 把e.printStackTrace的堆栈信息打印在log.error()中
  9. UT源码105032014052
  10. prepareStatement的用法和解释