堆就是一个完全二叉树,堆要求是指 该节点大于它的两个子节点。而两个字节点大小不一定。堆排序的最坏时间复杂度为nlog(n),平均也为nlog(n),占用空间为o(1),是一种比较排序算法。堆排序也可以用于找最大的k个数。时间复杂度为klog(n),因为建堆后,每次循环实际上都生成一个最大数。下面见代...
分类:
编程语言 时间:
2015-04-28 11:16:36
阅读次数:
161
/*
* 堆的性质(最小堆为例):
* 0.根节点为最小值
* 1.堆可以看做是一个完全二叉树(即孩子节点从左向右排列)
* 2.堆的高度lgn/lg2(n为节点的数目)
* 3.第i节点的左孩子节点是2*i+1,右孩子节点为2*i+2
* 4.以任意一个节点作为根节点,那么该节点都是堆
* 5.可以用一个数据来表示堆
*/
/*
* 构建堆的原理:
* 上滤
* 在最后一个节点后建立一个空节点...
分类:
编程语言 时间:
2015-04-23 21:47:50
阅读次数:
182
这里以小顶堆为例:思路:对于堆排序来说,首先需要做的是要建堆,建堆是一个不断调整堆的过程,能够在线性时间内完成。堆排序的过程1、建堆,建堆是不断调整堆的过程,从len/2处开始调整,一直到第一个节点,此处len是堆中元素的个数。建堆的过程是线性的过程,从len/2到0处一直调用调整堆的过程,相当于o...
分类:
编程语言 时间:
2015-04-10 23:47:55
阅读次数:
175
堆排序,是利用堆结构进行排序,一般是利用最大堆,即根节点比左右两个子树的节点都大,具体算法步骤如下。
一、创建堆
首先将数组中的元素调整成堆,对应下面程序中的createHeap(List list)方法。创建堆就是从树中最后一个内节点(下标为(n-1)/2)开始调整数组中元素的位置,使以这个内节点为根的子树满足堆的结构。即依次将以(n-1)/2、(n-1)/2-1、(n-1)...
分类:
编程语言 时间:
2015-04-09 17:38:23
阅读次数:
332
本段代码实现了建堆,维护最大堆的性质,堆排序函数,优先队列的相关函数(插入,找最大值,提取出最大值,增加关键值,增加元素),以及相关的测试 1 #include 2 #include 3 #include 4 #define LEFT(i) (2 * i) 5 #define RIG...
分类:
编程语言 时间:
2015-04-06 23:02:56
阅读次数:
193
这次的作业完全是依葫芦画瓢,参照云课堂《数据结构》(http://mooc.study.163.com/learn/ZJU-1000033001#/learn/content)中何钦铭老师课件中有关建堆及插入的内容,再加上自己写的一个矬函数(竟然传了4个参数),OK了!题设要求及代码实现如下 1 ....
分类:
其他好文 时间:
2015-04-05 21:48:49
阅读次数:
123
这次一口气放9道题~LeetCode23题,Hard!归并K个有序链表。使用堆来做,一开始把K个链表的第一个元素放进数组,然后建堆。之后取出第一个元素(如果这个元素是nil元素,直接退出)放进归并后的链表,再从这个元素所在的链表取第一个元素放到原来元素的位子上,然后重新维护堆性..
分类:
其他好文 时间:
2015-04-02 11:49:58
阅读次数:
192
也有好几天没记录算法学习情况了,这两天看了《算法导论》的第二部分,排序和顺序统计学,记录一下,也顺便增强记忆1.堆排序 就是最大堆和最小堆,用一维数组存储,数据结构是完全二叉树。主要过程分为构建最大/最小堆,插入操作,弹出最大值,取最大/最小值,改变堆中的权值。 构建堆就是从第一个非叶子节点...
分类:
编程语言 时间:
2015-03-21 22:50:14
阅读次数:
215
堆排序分为建堆,调整堆两个步骤。 关键是分清数组大小和堆大小,因为数组的最后几个元素已经是排好序,相当于从堆中移除了。 ``` #include using namespace std; void HeapAdjust(int *a, int i, int size) { i...
分类:
编程语言 时间:
2015-03-21 11:24:34
阅读次数:
218
排序 堆的实现和利用堆来排序排序 堆的实现和利用堆来排序Table of Contents一些基本的定义heapy:调整堆build:建堆insert:插入新的元素removetop:取出堆顶现在来使用堆来排序,只要每次都 removetop 就行了堆是最有趣的数据结构,看过《算法导论》的都会很容易...
分类:
编程语言 时间:
2015-03-17 00:34:16
阅读次数:
167