一、二叉树
1.基本特征
1)树型结构的最简模型,每个节点最多有两个子节点——左子节点和右子节点。
2)单根性,每个子节点有且仅有一个父节点,整棵树有且仅有一个根节点。
3)递归性,以任何一个节点为根都可以看做是一个二叉树,整个二叉树可以看成是由若干子二叉树按照递归的结构复合而成。这种结构的递归性决定了采用递归的算法解决二叉树问题会非常简单。
2.基本操作:按照特定的规则生成,再按照特定的规则遍历,将会产生特定的效果。
3.实现要点(以有序二叉树为例)
有序二叉树:对于树上的任何一个节点,其左子树中的节点都比该节点的值小或等,右子树中的节点都比该节点的值大或等。
50 70 20 60 40 30 10 90 80
50
__/ \__
/| \
20 | 70
/ \| / \
10 40 60 90
/ /
30 80
/
10
前序遍历:D-L-R、D-R-L
中序遍历:L-D-R、R-D-L
后序遍历:L-R-D、R-L-D
有序二叉树的中序遍历:
10 20 30 40 50 60 70 80 90
二、常用排序算法
13 23 20 12 15 31 19 26 24
1.冒泡排序
1)算法
A.比较相邻的元素,如果第一个比第二个大就交换它们;
B.对每一对相邻的元素都做同样的工作,从开始的第一对到结尾的最后一对。经过这一步,最后的元素是最大值;
C.针对所有的元素重复以上步骤,除了最后一个;
D.持续每次对越来越少的元素重复以上步骤,直到没有元素需要交换。
2)评价
平均时间复杂度O(N^2),稳定,对数据的有序性敏感。
2.插入排序
12 13 15 20 23 31 19 26 24
1)算法
A.从第一个元素开始,该元素可以认为已经有序;
B.取出下一个元素,在已经排序的元素序列中从后向前扫描;
C.若该元素大于新元素,则将该元素移到下一个位置;
D.若该元素小于或等于新元素,则将新元素插入到该元素之后;
E.重复步骤B,直至处理完所有的元素。
2)评价
平均时间复杂度O(N^2),稳定,对数据的有序性敏感。相对冒泡排序,没有交换而仅仅是移动,略优于冒泡。
3.选择排序
12 13 15 23 20 31 19 26 24
1)算法
首先在未排序序列中找到最小元素,并于该序列的首元素做交换,再从剩余的未排序序列中继续寻找最小元素重复以上过程,直到未排序序列中仅剩一个元素为止。
2)评价
平均时间复杂度O(N^2),稳定,对数据的有序性不敏感。相对冒泡而言,因为交换的次数少,略优于冒泡。
4.快速排序
50
0 10 20 30 40 50 80 70 60 90 100
i
p
j
1)算法
A.从序列中找出一个元素作为基准;
B.从新组织序列,所有小于基准的元素都位于基准的左侧,所有大于基准的元素都位于基准的右侧,与基准相等的元素可位于基准的任一侧;
C.以递归的方式分别对左右两个分组进行排序。
2)评价
平均时间复杂度O(NlogN),不稳定。理论上如果每次都能做到均匀分组,会得到的最快的排序速度。
思考:实现qsort()函数。