算法三:树和堆排序

原创 2015年07月08日 15:43:24
1、(不包含回路的,即n个结点恰好有n-1条边)
任意两个结点有且仅有唯一的一条路径连通。

根/祖先/根节点(没有父亲)

节点/结点

夫节点/父亲

子节点/儿子

叶结点(没有儿子)

深度:根到这个结点的层数。

2、二叉树:每个结点最多有两个儿子(左儿子,右儿子)

满二叉树:每个结点都有两个儿子/所有的叶结点都有相同的深度。
深度为h且有2^h-1个结点的二叉树。

完全二叉树:满二叉树最右边位置上拿掉一个或者几个叶结点
深度为h,除h层外,其他各层(1 - h-1)的结点数都达到最大个数。

完全二叉树存储:一维数组,从左到右一层一层放。
有N个结点,那么这个完全二叉树的高度为log2 N。
最典型的应用就是堆。

3、最小堆:所有父结点都比子结点要小

随便n元素的数,按照完全二叉树方式放入一个数组,生成最小堆:
1、从最后一个非叶结点(结点数组编号为n/2)开始,对该结点和下面的左右叶结点进行比较,使最小的数放在非叶结点上。
2、扫描完这层后,开始扫描上一层,该结点如果要移位,就需要对下面及下面的叶结点进行比较,使其符合最小堆要求,不移位不比较。
3、重复,直到扫描到根节点(结点编号为1)为止。
时间复杂度O(N)

5、堆排序
时间复杂度和快速排序一样O(NlogN)。
以从小到大排序为例。
1、生成最大堆   
2、把数组中最后h[n]的数和h[1]的数进行交换,n--
3、补上来的数h[1]和子节点一层一层对比,把小的数往上移,直到不能移动时,再跳到2反复。
create();
while(n>1)
{
    swap(1,n);
    n--;
    siftdown(1);
}

siftdown(int i)
{
    while(!到底或已经没有小的) 
    {
        n[i]和左儿子比,和右儿子比,如果有小的交换并记录在t中。
更新到交换后的结点i=t。
    }
}

6、堆的应用
优先队列:普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。
二叉堆就是优先队列(父节点大于子节点)

求一个数列中第K大/小的数。
取出K个数建一个大小为K的最小/大堆,再从K+1个数开始,依次拿去和堆顶比较,如果要小/大,就舍弃,如果大/小就一层一层往下比和移。
时间复杂度O(NlogN)

并查集/不相交集数据结构的算法:
通过一个数组来实现,其本质是维护一个森林,刚开始的时候,森林的每个点都是孤立的,可理解成一个结点的树,
之后通过一些条件,逐步将这些树合并成一棵大树。判断两个节点是否已经在同一棵树(数其实是个集合)中的时候,
也要注意必须求其根源,中间父亲节点是不能说明问题的,必须找到其祖宗判断两个结点的祖宗是否是同一个根结点才行。



二叉排序树和堆的区别

在二叉排序树中,每个结点的值均大于其左子树上所有结点的值,小于其右子树上所有结点的值,对二叉排序树进行中序遍历得到一个有序序列。所以,二叉排序树是结点之间满足一定次序关系的二叉树;   堆是一个完...
  • UP19910522
  • UP19910522
  • 2015年11月20日 12:36
  • 5498

算法(第四版)学习笔记之java实现堆排序

继上一篇实现基于堆的优先队列后,这次将利用上一次完成的基于堆的能够重复删除最大元素操作的优先队列来实现一种经典而优雅的排序算法,称之为堆排序。 堆排序可分为两个阶段: 1.构建堆:在堆的构建过程中...
  • l243225530
  • l243225530
  • 2015年07月26日 16:02
  • 1040

二叉树及堆排序

一、二叉树的定义      在计算机科学中,二叉树是每个结点最多有两个子树的有序树。通常根的子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作...
  • StrongManTwo
  • StrongManTwo
  • 2014年12月16日 11:16
  • 1356

堆排序 (包括升序和降序,Arraylist 实现)

补充上一篇 利用Arraylist实现的堆排序(包含升序和降序)
  • u012485480
  • u012485480
  • 2017年09月12日 16:58
  • 260

排序算法(七)——堆排序

基本思想 堆排序是一种树形选择排序,是对直接选择排序的改进。   首先,我们来看看什么是堆(heap): (1)堆中某个节点的值总是不大于或不小于其父节点的值; (2)堆总是一棵完全二叉树(Compl...
  • u012152619
  • u012152619
  • 2015年08月13日 08:39
  • 14391

排序算法-堆排序

堆排序算法是建立在堆这种数据结构的基础上,其实堆听着很高端,其实很简单,就是一个二叉树,但是又特殊条件,就是其父节点比孩子节点都大(或都小)的堆称为最大堆(最小堆),瞬间感觉很简单了,最简单的保存方法...
  • y990041769
  • y990041769
  • 2015年06月22日 21:29
  • 1628

【每日算法】堆排序&优先队列

堆排序(heapsort)的运行时间为O(n logn),是一种原地排序算法,是不稳定的排序算法。堆基本介绍先直观感受一下,下面就是一个堆:16 7 3 20 17 8什么??上面不就一个数组吗……?...
  • jiange_zh
  • jiange_zh
  • 2016年02月19日 23:42
  • 2740

堆排序(基本思想以及算法实现)

1、引言 简单选择排序算法是通过比较,确定最终的位置。假设未排序的元素个数为N,则遍历一趟,需要比较N-1次,再遍历下一趟时,需比较N-2次。但是,第二次的比较是完全独立的,没有利用第一次比较的信息...
  • u012549515
  • u012549515
  • 2013年10月30日 15:20
  • 1655

《算法4》中的堆排序

堆排序
  • markjenny
  • markjenny
  • 2015年07月10日 11:04
  • 717

经典算法——堆排序笔试题

阿里巴巴2016研发工程师笔试选择题 1.将整数数组(7-6-3-5-4-1-2)按照堆排序的方式原地进行升序排列,请问在第一轮排序结束之后,数组的顺序是_____。...
  • geekmanong
  • geekmanong
  • 2016年04月21日 15:44
  • 1870
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法三:树和堆排序
举报原因:
原因补充:

(最多只允许输入30个字)