从学校开始到现在学习数据结构也有好久了,现在感觉需要总结一下
先总结一下
排序:
冒泡排序:
时间复杂度
平均情况:O(n^2) 最好情况:O(n) 最坏情况:O(n^2)
空间复杂度:O(1)
稳定性:稳定
简单选择排序:
时间复杂度
平均情况:O(n^2) 最好情况:O(n^2) 最坏情况:O(n^2)
空间复杂度:O(1)
稳定性:稳定直接插入排序:
时间复杂度
平均情况:O(n^2) 最好情况:O(n) 最坏情况:O(n^2)
空间复杂度:O(1)
稳定性:稳定希尔排序:
时间复杂度
平均情况:O(nlogn)~O(n^2) 最好情况:O(n^1.3) 最坏情况:O(n^2)
空间复杂度:O(1)
稳定性:不稳定堆排序:
时间复杂度
平均情况:O(nlogn) 最好情况:O(nlogn) 最坏情况:O(nlogn)
空间复杂度:O(1)
稳定性:不稳定归并排序:
时间复杂度
平均情况:O(nlogn) 最好情况:O(nlogn) 最坏情况:O(nlogn)
空间复杂度:O(n)
稳定性:稳定快速排序:
时间复杂度
平均情况:O(nlogn) 最好情况:O(nlogn) 最坏情况:O(n^2)
空间复杂度:O(logn) ~ O(n)
稳定性:不稳定 其中,冒泡 简单选择 直接插入属于简单算法,希尔 堆 归并 快速属于改进算法。希尔排序相当于直接插入排序的升级,它们同属于插入排序类,堆排序相当于简单选择排序的升级,他们同属于选择排序类。而快速排序其实就是冒泡排序的升级,它们都属于交换排序类。



顺序表查找:很简单就是从开头找到最后就行了。一般表都是无序的,所以时间复杂度就是O(1) ~ O(n)
有序表查找:
折半查找:mid = (low + high)/2
插值查找: mid = low + (high - low)*(key - a[low])/(a[high] - a[low])
斐波那契查找:mid = low + F[k - 1] - 1 (利用了斐波那契数组的黄金分割原理来实现的。)
三种有序表的查找本质上是分隔点的选择不同,各有各自的应用场合,在实际开发中要根据实际情况而定,但他们的平均时间复杂度均为O(logn)。
线性索引查找
稠密索引
分块索引(块内无序,块间有序)
倒排索引(根据关键字索引)
平衡二叉树:
平衡二叉树是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1.
二叉排序树:
二叉排序树,又称为二叉查找树。它或者是一颗空树,或者是具有下列性质的二叉树:
若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根节点的值;
它的左右子树也分别为二叉排序树。
平衡二叉树的查找 插入 删除的时间复杂度均为O(logn)
B树用于内存和外存之间的存取而专门设计的。
哈系表的方法实质上就是根据一定的方法去最有可能的地方去找人。比如找学生一定去学校啊,找警察要去警局。常用方法是:
直接定址法
数字分析法
平方取中法
折叠法
除留余数法
随机数法
处理哈系冲突的方法:
开放定址法:发生冲突就去寻找下一个空的散列地址。
再哈系法:需要多准备几个哈系函数。
链地址法:将冲突放在单链表中。
公共溢出区法:将冲突的都放在一个公共的地方。
单链表 循环链表 双向链表
栈 队列 循环队列