1.选择排序:不稳定,时间复杂度 O(n^2)
2.插入排序:稳定,时间复杂度 O(n^2)
3.冒泡排序:稳定,时间复杂度 O(n^2)
4.堆排序:不稳定,时间复杂度 O(nlog n)
5.归并排序:稳定,时间复杂度 O(nlog n)
6.快速排序:不稳定,时间复杂度 最理想 O(nlogn) 最差时间O(n^2)
7.希尔排序:不稳定,时间复杂度 平均时间 O(nlogn) 最差时间O(n^s) 1<s<2
排序类别 | 时间复杂度 | 空间复杂度 | 稳定 | |
1 | 插入排序 | O(n2) | 1 | √ |
2 | 希尔排序 | O(n2) | 1 | × |
3 | 冒泡排序 | O(n2) | 1 | √ |
4 | 选择排序 | O(n2) | 1 | × |
5 | 快速排序 | O(Nlogn) | O(logn) | × |
6 | 堆排序 | O(Nlogn) | 1 | × |
7 | 归并排序 | O(Nlogn) | O(n) | √ |
查找:分为静态查询和动态查询:
只进行查找的称为静态查询;
在查询的过程中同时操作数据,删除存在数据或者插入不存在的数据,称为动态查查询。
静态查询:
1.顺序查询:
算法思想:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,若直至第一个记录,其关键字和给定值比较都不等,则表明表中没有所查记录,查找不成功
平均查询长度:(n+1)/2
2、二分查询(有序表):
算法思想:先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止。
平均查询长度:(n+1)/n *log2(n+1) -1
3、分块查询(索引顺序查询):
算法思想:首先将一个线性表按照一定的函数关系和条件划分为若干个逻辑字表,为每个字表建立一个索引项,由所有的字表的索引项构成一个索引表。当进行分块查找时,先根据所给的关键字查询索引表,从中找出给定k值小于或等于索引值的那个索引块,找到待查块,然后在主表中查询该快,查询待查的记录。
平均查询长度:索引表是有序的,所以在索引表中可以用顺序查询,也可以用折半查询;而块内的记录的随机排序的,所以在块中用顺序查询。
顺序查询确定块:平均查询长度为1/2 *(n/s +s)+1
二分查询确定块:平均查询长度为log2(n/s +1)+s/2
动态查询:(表结构动态生成)
1、二叉排序树查询
二叉排序树(二叉搜索树、二叉查询树):二叉排序树中序遍历得到的必定是一个有序序列。
查找过程:
(1)若查询树为空,查询失败;
(2)若查询树非空,将给定值和查询树的根节点比较:
时间复杂度:平均O(logn),最坏O(n)
二叉排序树的插入:
新插入的结点一定是一个新添加的叶子节点,并且是查询不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点。
二叉排序树的结点删除:
假设在二叉排序树上被删结点为p,其双亲结点为f,且p为f的左孩子,下面分三种情况讨论:
(1)若p结点为叶子节点,即pl和pr均为空树,由于删去叶子节点不破坏整棵树的结构,则只需修改其双亲结点的指针即可。
(2)若p结点只有左子树pl或者只有右子树pr,此时只要令pl和pr直接成为其双亲结点f的左子树即可。
(3)若p结点的左子树和右子树均不空。
2、二叉平衡树
左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1.若将二叉树上结点的平衡因子定义为该节点的左子树的深度减去它的右子树的深度,则平衡二叉树上所有结点的平衡因子只能是-1,1,0.平衡树查询的时间复杂度为O()logn