算法三:树和堆排序

原创 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)

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



三、算法_堆排序

堆排序 堆排序介绍 堆是一个完全二叉树:每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆;或每个节点值都小雨等于其左右孩子的值,称为小顶堆。堆排序C#实现-顺序存储:class Progra...

算法导论学习笔记(三):堆排序

堆排序是一种利用堆的性质进行的排序算法。所以学习堆排序之前先来简单介绍下堆。 堆 堆数据结构是一种数组对象,如图一所示,它可以被视为一颗完全二叉树。      图一 树中的每个结点...

日常记录:《算法导论》学习笔记之三—堆排序

堆排序(heapsort)算法的实现。
  • Mr_Avin
  • Mr_Avin
  • 2016年11月21日 17:23
  • 202

【算法导论之三】大根堆堆排序

1. 堆的概念(默认为二叉堆)     堆数据结构是一种数组对象,它可以被视为一棵完全二叉树。树中每个结点与数组中存放该结点的那个元素对应。树的每一层都是填满的,最后一层可能除外(最后一层从一个节点的...

堆排序算法c语言实现

  • 2015年10月25日 14:24
  • 2KB
  • 下载

堆排序算法导论

  • 2013年11月11日 23:54
  • 152KB
  • 下载

排序算法(三)堆排序原理与实现(小顶堆)

堆排序实际上是利用堆的性质来进行排序的,要知道堆排序的原理我们首先一定要知道什么是堆。 堆的定义: 堆实际上是一棵完全二叉树。 堆满足两个性质: 1、堆的每一个父节点都大于(或小于)其子节点;...

堆排序算法

  • 2013年10月27日 09:53
  • 5KB
  • 下载

堆排序算法详细配图讲解

  • 2013年12月18日 21:11
  • 556KB
  • 下载

(高效率排序算法三)堆排序

一.堆的介绍        堆有如下特点的二叉树:           1.他是完全的二叉树。也就是说,除了树的最后一层布需要时满的,其他的每一层从左到右都是满的.(如下图的完全二叉树跟不完全二叉树)...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法三:树和堆排序
举报原因:
原因补充:

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