树、二叉树、堆排序

文章介绍了数组表示树的方法,包括先序、中序、后序遍历,以及完全二叉树和近似完全二叉树的概念。接着,讨论了二叉堆的性质和堆排序的过程,提到了大顶堆和小顶堆。此外,还概述了几种非比较排序算法,如计数排序、桶排序和基数排序,强调了它们的特点和适用场景。最后,提出了两个基于排序的问题,一个是寻找数组中和为给定值的二元组,另一个是确定无序数组中最需要排序的子数组长度。

【基础知识】

 

1.用数组表示一棵树

子节点2i-1,2i+1  若一个结点的左子树或右子树超出了数组下标,则说明其没有子节点即叶子结点

父节点(i-1)/2 

2.遍历方法

(1)先序遍历(根左右):78,56,43,2,23,4,34,1,15

(2)中序遍历(左根右):2,43,23,56,4,78,1,34,15

(3)后序遍历(左右根):2,23,43,4,56,1,15,34,78

3.完全二叉树:每个结点都有2个叶子节点。  近似完全二叉树:从右边最后一个叶子结点开始缺少

4.二叉堆是完全二叉树或者是近似完全二叉树,二叉堆满足2个特性

   (1)父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值
   (2)每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)(递归)
5.任意节点的值都大于其子节点的值——大顶堆       任意节点的值都小于其子节点的值——小顶堆

6.堆排序步骤

   (1)堆化,反向调整使得每个子树都是大顶堆或者小顶堆
   (2)按序输出元素:把堆顶和最末元素对调,然后调整堆顶元素

小顶堆伪代码,小顶堆做出来的是逆序

7.堆排序伪代码

 8.计数排序

一句话:用辅助数组对数组中出现的数字计数,元素转下标,下标转元素
假设元素均大于等于0 ,依次扫描原数组,将元素值k记录在辅助数组的k位上
依次扫描辅助数组,如果为1 ,将其插入目标数组的空白处
存在的问题:1.重复元素  2.有负数

计数排序是最快的一种,因为不涉及到比较 

 9.桶排序

一句话:通过"分配”和"收集”过程来实现排序;
思想是:设计k个桶( bucket) ( 编号0~k-1) ,然后将n个输入数分布到各个桶中去,对各个桶中的数进行排序,然后按照次序把各个桶中的元素列出来即可。

时间复杂度:O(N)~O(NlgN)
用链表 

10.基数排序

基数排序过程无须比较关键字,而是通过“分配”和“收集 ”过程来实现排序,它的时间复杂度可达到线性阶: O(n)。 对于十进制数来说,每位的数在[0,9]之中,d位的数,则有d列。基数排序首先按低位有效数字进行排,然后逐次向上一位进行排序,直到最高位排序结束。
【算法】时间复杂度是KxN,K是位数,二维数组[0-9]对应10个ArrayList[ ]。有负数,做一次转换全部变为正数即可

【代码】

11.排序数组中找和的因子
【问题描述】给定已排序数组arr和k ,不重复打印arr中所有相加和为k的不降序二元组
如输入arr={-8, -4,-3,0,2,4,5,8,9,10},k=10 输出(0,10)(2,8)

【算法】已排序算数组--->二分法 ,2个指针头和尾,-8+10=2<10,所以左指针右移,直到0+10=10输出,2+10=12>10,右指针左移直到2+8=10,2+5=7,4+5=9。左指针右移在5重叠,小于10左指针右移,大于10右指针左移

12.需要排序的子数组

【问题描述】给定一个无序数组arr,求出需要排序的最短子数组长度,要求O(N),如输入arr={2,3,7,5,4,6},返回4,因为只有{7,5,4,6}需要排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值