经典排序算法 - 堆排序Heap sort
堆排序有点小复杂,分成三块
第一块,什么是堆,什么是最大堆
第二块,怎么将堆调整为最大堆,这部分是重点
第三块,堆排序介绍
第一块,什么是堆,什么是最大堆
什么是堆
这里的堆(二叉堆),指得不是堆栈的那个堆,而是一种数据结构。
堆可以视为一棵完全的二叉树,完全二叉树的一个“优秀”的性质是,除了最底层之外,每一层都是满的,这使得堆可...
分类:
编程语言 时间:
2014-12-16 13:35:14
阅读次数:
219
/* date:2014.12.15
堆结构:是一种树结构,准确说为完全二叉树。在这个树中,每个节点对应原始数据的一个记录,且满足一下条件:1.如果按照从小到大的顺序排序,要求非叶节点的数据要大于或等于其左右子节点的数据;2.如果按照从大到小的顺序排序,要求非叶节点的数据要小于或等于其左右子节点的数据。
堆排序思路:基于选择排序的思想,利用堆结构和二叉树的一些性质来完成数据的排序。
流程:1...
分类:
编程语言 时间:
2014-12-15 20:24:47
阅读次数:
226
题目大意:给一颗深度为D的完全二叉树,节点编号从上到下从左到右为1,2,3,4……
在结点1上方一个小球,小球落到一个结点上就会改变该点的开关。若该点开,则向
左走,否则向右走,给你I个小球,问最后一个小球最后所能落到的叶子编号。
思路:每一个结点上第奇数个小球都落在左子树上,第偶数个小球都落在右子树上。
直接对最后一个小球判断就可以了。若I为该结点奇数,它是向左走的第(I+1)/2个小球。
若为偶数,则是向右走的I/2个小球。...
分类:
其他好文 时间:
2014-12-11 10:31:18
阅读次数:
194
优先队列包括二叉堆、d-堆、左式堆、斜堆、二项队列等
1、二叉堆
堆是一棵被完全填满的二叉树,有可能例外的是在底层,底层上的元素从左到右填入。这样的树称为完全二叉树。
堆序的性质:在一个堆中,对于每一个节点X,X的父亲的关键字小于(或等于)X中的关键字,根节点除外(它没有父节点)。完全二叉树可以用数组实现。...
分类:
其他好文 时间:
2014-11-30 20:10:24
阅读次数:
205
注:本节主要讨论最大堆(最小堆同理)。一、堆的概念 堆,又称二叉堆。同二叉查找树一样,堆也有两个性质,即结构性和堆序性。 1、结构性质: 堆是一棵被完全填满的二叉树,有可能的例外是在底层,底层上的元素从左到右填入。这样的树称为完全二叉树(complete binary tree)。下图就是这样一个例...
分类:
其他好文 时间:
2014-11-28 15:49:09
阅读次数:
238
听说有一种最小(大)堆,不限于是完全二叉树,而是完全D叉树,名为D-ary Heap(http://en.wikipedia.org/wiki/D-ary_heap)。D可以是1,2,3,4,100,对于优先队列该有的功能都没有问题。 动手写一个D-ary Heap,应该不难。简单起见,不考虑...
分类:
其他好文 时间:
2014-11-27 00:00:48
阅读次数:
519
线段树的实现及其经典用法(C++实现)
一、线段树的定义
首先,线段树是一棵完全二叉树。它的特点是:每个结点表示的是一个线段,或者说是一个区间。事实上,一棵线段树的根结点表示的是“整体”区间,而它的左右子树也是一棵线段树,分别表示区间的左半边和右半边。树中的每个结点表示一个区间[a,b]。每一个叶子结点表示一个单位区间。对于每一个非叶结点所表示的结点[a,b],其左孩子表示的区间为[a,(a+b)/2],右孩子表示的区间为[(a+b)/2,b]。 用T(a, b)表示一棵线段树,参数a,b表示区间[...
分类:
编程语言 时间:
2014-11-25 23:39:34
阅读次数:
723
看书、思考、写代码!
/*********************************************
* copyright@hustyangju
* blog: http://blog.csdn.net/hustyangju
* 题目:堆排序实现,另外实现接口:取堆最大值并删除、堆插入
* 思路:堆是在顺序数组原址上实现的,利用完全二叉树的性质,更具最大堆和最小堆的定义实...
分类:
编程语言 时间:
2014-11-21 12:42:16
阅读次数:
171
平衡二叉树(AVL)是一种特殊的二叉搜索树,他满足两个性质:1. 此树是二叉搜索树2. 任意节点的左右子树高度差的绝对值不超过1这样是为了提高查询的效率,因为一般的二叉搜索树有可能不会是完全二叉树或者接近完全二叉树情况,有的甚至退化成链表,所以平衡二叉树将二叉树平衡一下,使得查询效率满足logn,主...
分类:
其他好文 时间:
2014-11-20 18:38:45
阅读次数:
225
二叉堆我们知道堆栈是一种LIFO(后进先出)结构,队列是一种FIFO(先进先出)结构,而二叉堆是一种最小值先出的数据结构,因此二叉堆很适合用来做排序。二叉树的性质:二叉堆是一棵完全二叉树,且任意一个结点的键值总是小于或等于其子结点的键值,二叉堆采用数组来存储(按广度优先遍历的顺序),而没有像普通的树...
分类:
其他好文 时间:
2014-11-19 20:16:13
阅读次数:
174