排序、树和图

来源:互联网 发布:免费刷空间人气软件 编辑:程序博客网 时间:2024/05/16 19:16

本文章只对解释基本知识,数据结构的代码以后的文章会着重总结

1.排序
<1>插入排序 稳定
基本思想:每次从待排序列中找到最小的,插入到已排序好的对列中。
时间复杂度:O(n^2)
空间复杂度:O(1)
特点:完全有序时,时间复杂度为O(n)

<2>希尔排序 不稳定
基本思想:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次插入排序。
时间复杂度:O(n^1.3)~O(n^1.5)
空间复杂度:O(1)

<3>冒泡排序 稳定
基本思想: 每一趟遍历,从前往后依次的比较两两相邻的数,如果前者比后者大,就交换位置。待排序列中最大的数下沉。
时间复杂度:O(n^2))
空间复杂度:O(1)

<4>快速排序 不稳定
基本思想:
一次划分函数:从数列中取出一个基准(一般取第一个);h从后向前遍历,找到比基准小的数字,将此数字填入之前取基准的坑中;l从前向后遍历,找到比基准大的数字,填入之前填基准挪走数字的坑中(即h的位置)。
重复上述操作,直到l,h(注意:小心l,h越过去)。相遇位置即基准要放入的位置。此刻基准左边都比基准小,基准右边都比基准大。(即基准已经到了最终该放的位置)
分治策略:只要数据量 >= 2 ,就继续执行划分函数
特点:越有序越慢

<5>选择排序 不稳定
基本思想:每一趟从待排序序列中选出最小(或者最大)的数据元素,顺序放在已排好序的最后,直到所有待排序序列都有序。
时间复杂度:O(n^2)
空间复杂度:O(1)

<6>堆排序 不稳定
基本思想:线性表实现的树型结构。分堆为大根堆和小根堆,管父子关系。大根堆,父节点的值大于子节点;小根堆,父节点的值小于子节点,左右孩子之间没有关系。
时间复杂度: 建堆O(n*logn) 调整堆O(logn) 总的O(n*logn)
空间复杂度:O(1)

<7>归序排序 稳定
基本思想:先让每个有序,再让两个有序,再让四个有序……将两个或者两个以上的有序表组合成一个有序的新的有序表。
时间复杂度:O(n*logn)
空间复杂度:O(n)

<8>基数排序/桶排序 稳定
基本思想:将待排序列的数据分组,放在一个个的桶中,然后对每个桶里面的在进行排序。

链表排序
单链表:冒牌排序
双向链表:快速排序

2.树和图
(1)树的性质
<1>二叉树第i层上最多有2^(i-1)个节点;

<2>深度为k的二叉树最多有2^k-1个节点;

<3>度为0的节点数为n0,度为2的节点数为n2,那么n0=n2+1;
证明:二叉树中的节点总数为n:

总节点的个数=度为0的节点个数+度为1的节点个数+度为1的节点个数
于是:n=n0+n1+n2;

有n个节点的二叉树,总边数为n-1,等于度为2的节点产生2条边,度为1的节点产生1条边,度为0的节点不产生边
于是:n-1=n1+2*n2;

所以:n0+n1+n2 = n1+2*n2+1—–>n0 = n2+1;

<4>完全二叉树中,度为1的节点总数为0或者1;

笔试题:完全二叉树中的节点总数为1001,求叶子节点的总数?
由n0=n2+1和n=n0+n1+n2,得:n = 2*n0+n1-1
当n1 = 0时,1001 = 2*n0+0-1—->501
当n1 = 1时,1001 = 2*n0+1-1—->n0不是整除

(2)遍历树的特殊情况
<1>如果前序遍历和中序遍历顺序一样,则树为所有节点只有右子树的二叉树;
<2>如果前序遍历和后序遍历顺序一样,则树为只有根节点的二叉树。

(3)森林与二叉树之间的转换
这里写图片描述
转换步骤:左孩子为当前节点的孩子节点,右子树是当前节点的兄弟节点

这里写图片描述

(4)图的邻接矩阵表示法
<1>无向图的邻接矩阵
这里写图片描述

<2>有向图的邻接矩阵
这里写图片描述

原创粉丝点击