排序算法系列——堆排序

记录学习点滴,菜鸟成长记

堆排序引入了另一种算法设计技巧:使用一种我们称之为“堆”的数据结构来进行数据管理。

堆排序算是真正意义上的利用数据结构来求解数组排序的方法。

“插入排序”和“归并排序”可以看做是一种“计算机体力活”,体现的思想更多的是去模拟最简单的人类思维,比如插入排序过程中的比较,归并中子问题合并时的比较。

“堆排序”可以看做是“计算机脑力活”,他利用了一种结构化的语言来表达,这种结构化带来一些性质,比如左右孩子、比【堆大小的一半向下取整】大的下标都是叶节点不需要维护其最大堆性质等。这里数据结构的性质更多的可以看做是一种“工具”,利用工具来工作总是“更快”和“高大上”一点。

1.堆

数组描述成(二叉)堆时,可以看做是一个近似的完全二叉树,除了最底层外,该树是完全充满的。

表示堆的数组A包括两个属性,A.length数组长度和A.heapsize堆大小,此处满足0≤A.heapsize≤A.length,可能的情况是数组元素并没有全部构成堆。

其他概念包括父节点、左孩子、右孩子,即给定一个节点i,有

1 def PARENT(i):
2     if i>1:
3         return i/2
4     else:
5         return i
6 def LEFT(i):
7     return 2*i
8 def RIGHT(i):
9     return 2*i+1

2.维护堆的性质

这里维护指的是使得根节点为LEFT(i)和RIGHT(i)都是最大堆,最大堆即指使得每个节点都大于其左右孩子,算法思想是使得A[i]的值在最大堆中“逐级下降”,从而使得整个堆所有节点保持最大堆性质。有

 1 def MAXHEAPIFY(A,i,heapsize):#维护最大堆性质,heapsize表示堆的大小
 2     l = LEFT(i)
 3     r = RIGHT(i)
 4     if i <= heapsize/2:
 5         if l <= heapsize and A[l-1] > A[i-1]:
 6             largest = l
 7         else:
 8             largest = i
 9         if r <= heapsize and A[r-1] > A[largest-1]:
10             largest = r
11         if largest != i:
12             A[i-1],A[largest-1] = A[largest-1],A[i-1]
13             MAXHEAPIFY(A,largest,heapsize) 

3.建堆

采用自底向上的方法将一个大小为n的数组A转换为最大堆。二叉树的性质决定从(n/2+1)开始,元素都是树的叶节点,每个叶节点都可以看做是包含一个元素的堆,可以看做是一个最大堆。对于其他所有非叶节点,依次维护其最大堆性质,有,

1 def BUILDMAXHEAP(A):
2     heapsize = len(A)
3     for i in range(heapsize/2,0,-1):#倒序循环
4         MAXHEAPIFY(A,i,heapsize) 

4.堆排序

堆排序的终极思想就是:因为维护了最大堆的性质,所以根节点是数组中最大值,建完的堆类似于一个倒序排列;每次将最大值(即序列第一个值)和序列最后一个值互换;互换后,继续维护前面n-1长度序列的最大堆性质,继续互换;……;最后,最大堆中只有根节点。

1 def HEAPSORT(A):
2     BUILDMAXHEAP(A)
3     length,heapsize = len(A),len(A)
4     for i in range(length,1,-1):
5         A[0],A[i-1] = A[i-1],A[0]
6         heapsize = heapsize - 1
7         MAXHEAPIFY(A, 1, heapsize)

排序算法系列——堆排序,布布扣,bubuko.com

时间: 2024-10-03 22:37:31

排序算法系列——堆排序的相关文章

(转载)排序算法系列

排序算法系列 目录 概述 概念 排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列. 排序分为内部排序和外部排序. 若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序. 反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序. 排序分类 如果按照策略来分类,大致可分为:交换排序.插入排序.选择排序.归并排序和基数排序.如 图-排序策略分类图 所示. 图-排序策略分类图 算

排序算法系列——归并排序

记录学习点滴,菜鸟成长记 归并排序的英文叫做Merge-Sort,要想明白归并排序算法,还要从“递归”的概念谈起. 1.递归 一般来讲,人在做决策行事的时候是往往是从已知出发,比如,我又要举个不恰当的例子了→_→: 看到漂亮姑娘→喜欢人家→追→女朋友→老婆 但是人家施瓦辛格不是这么想的,人家从小就立志当总统: 要当总统←先当州长←竞选州长要有钱←那得找个有钱妹子←妹子都喜欢明星←身材好能当明星←健身 递归,就像一个人对自己的发展有清晰的规划和坚定的信心一样,他知道每一步会有怎么样的结果,他需要仅

排序算法系列——快速排序

记录学习点滴 快速排序算法是一种很有趣的算法,短小精悍,性能强劲,对于大部分情况都可以胜任,但对极端环境难以应付. 快速排序我理解为:这是一个“以自我为中心的”+“分治法”思想的算法. 分治法不必多说,化繁为简,那就是逐个击破. 那什么是“以自我为中心”?顾名思义,就是每次都一个“我”,每个人都要围绕“我”行事,比“我”小的都去左边站着,比“我”他大的都去右边站着,而且“我”不去关心每一边都有谁,反正你没“我”大或者小就行.一旦“我”落位了妥帖了,“我”就不动了.然后再在左右两边分别产生新“我”

排序算法系列——插入排序

记录学习点滴,菜鸟成长记 接触算法是研究生期间做项目时,需要编写一些诸如GA.QGA的时候,第一次使用“排序”还是用的Java自带的Comparator接口.后来买了<算法导论>来看,发现果然所有知识都是有专业壁垒的,简单的一个问题尽然蕴藏着如此多的思想,发现此简直欣喜无比,遂决定要好好研究研究.只有深入后才发现,原来算法的不仅仅是按照逻辑顺序写个程序那么简单,好的算法要考虑到方方面面,最简单的时间复杂度就够我学习很长时间了. 将自己学习排序算法的一些理解和感悟记录于此,方便自己温故而知新.

经典排序算法系列7----堆与堆排序

堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先讲解下什么是数据结构中的二叉堆. 二叉堆的定义 二叉堆是完全二叉树或者是近似完全二叉树. 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值. 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆). 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆.当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆.下图展示一个最小堆: 由于其它几

排序算法系列——八大排序算法对比分析

本系列最后一篇,综合分析下前面介绍的八种排序算法的效率,以及各自的适用情况. 下面先看看八种排序算法的时间复杂度表格: 图中八种排序被分成了两组,一组时间复杂度为O(n^2),另一组相对高效些. 下面先对第一组O(n^2)的四种排序算法进行对比,分别取数组长度为100,1000,10000,100000四个数量级,各个元素在0-10000000之间随机获取.下面看下结果的分析. 排序算法 长度=100 长度=1000 长度=10000 长度=100000 直接插入排序 535 2,198 135

排序算法: 堆排序法

一,使用堆排序法之前,需要了解堆的特性: 1,堆一般都用数组的方式来存储,堆分为“最大堆”和“最小堆”: 2,以“最大堆”为例: (1)一个节点最多有两个子节点,即左右节点,每个节点都是一个堆: (2)父节点的值不小于子节点的值: (3)一个i节点,其父节点为(i-1)/2,左节点(2*i+1),右节点(2*i+2) 一个最大堆例子: 数组 int a[]: 83 78 81 48 17 27 二,将一个数组形成堆(以最大堆为例) 数组a[]: 27 48 81 78 17 83 形成最大堆思路

排序算法之堆排序(Heapsort)解析

一.堆排序的优缺点(pros and cons) (还是简单的说说这个,毕竟没有必要浪费时间去理解一个糟糕的的算法) 优点: 堆排序的效率与快排.归并相同,都达到了基于比较的排序算法效率的峰值(时间复杂度为O(nlogn)) 除了高效之外,最大的亮点就是只需要O(1)的辅助空间了,既最高效率又最节省空间,只此一家了 堆排序效率相对稳定,不像快排在最坏情况下时间复杂度会变成O(n^2)),所以无论待排序序列是否有序,堆排序的效率都是O(nlogn)不变(注意这里的稳定特指平均时间复杂度=最坏时间复

排序算法系列:冒泡排序与双向冒泡排序

概述 排序算法应该算是一个比较热门的话题,在各个技术博客平台上也都有一些博文进行了一定程度的讲解.但还是希望能从自我完善的角度出发,可以更详细.全面.形象地表达这些算法的精髓.本文就先从最简单的冒泡排序开始说起,别说你已经彻底了解了冒泡排序算法(虽然一开始我也是这样以为的). 版权说明 本文链接:http://blog.csdn.net/lemon_tree12138/article/details/50474230 – Coding-Naga - 转载请注明出处 目录 概述 版权说明 目录 冒