时间复杂度:
O(1)<O(logn)<O(n)<O(nlogn)<O()<O(
)<O(
)<O(n!)<O(
)
取数据 | 查找 | 插入 | 删除 | |
数组 | O(1) | O(n) | O(n) | O(n) |
链表 | O(n) | O(n) | O(1) | O(1) |
二叉搜索树 | O(logn)~O(n) |
折半查找 | O(logn) |
红黑树(自平衡的二叉查找树) | O(logn) |
二叉搜索树为平衡二叉树时,时间复杂度是O(logn),当它是一条线时,性能最差,时间复杂度就变为O(n)
排序方法 | 平均情况 | 最好情况 | 最坏情况 | 辅助空间 | 稳定性 |
冒泡排序 | O(![]() | O(n) | O(![]() | O(1) | 稳定 |
简单选择排序 | O(![]() | O(![]() | O(![]() | O(1) | 稳定 |
直接插入排序 | O(![]() | O(n) | O(![]() | O(1) | 稳定 |
希尔排序 | O(nlogn)~O(![]() | O(![]() | O(![]() | O(1) | 不稳定 |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 稳定 |
快速排序 | O(nlogn) | O(nlogn) | O(![]() | O(logn)~O(n) | 不稳定 |
堆排序是不稳定的,因为记录的比较和交换是跳跃的
快排的时间性能取决于快排的递归深度。在最优的情况下,partition每次都划分的很均匀,递归树是平衡的,递归树的深度是
|__| +1,仅需递归
次;在最坏的情况下,待排序的序列是正序或者逆序,每次划分只得到一个比上一次划分少一个记录的子序列,另一个为空,用递归树表示就是一颗斜树,此时需要执行n-1次递归调用,最终其时间复杂度是O(
)。
快排的空间复杂度主要是递归造成的栈空间的使用。最好的情况,递归树的深度是,其空间复杂度也就为O(logn);最坏的情况是需要n-1次递归调用,其空间复杂度就为O(n);平均情况,空间复杂度也为O(logn)