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

被折叠的 条评论
为什么被折叠?



