数组:
insert:中间插入O(n),末尾插入O(1)
delete:知道index O(1), 不知道index O(查找算法)
抽象数据类型(ADT):
概念:只考虑功能不考虑具体实现,意味着有多种实现方式,也就意味着需要根据不同的场景考虑最合适的实现,联系接口。
栈:后进先出 or 先进后出
队列:
1、普通队列:先进先出
2、双端队列:待补充
3、优先队列:
顾名思义优先级最高的先出队列,CPU调度就有用到优先队列。
列表(也叫线性表):可以用数组实现,也可以用链表实现等
链表:
单链表(LinkedList):
双端链表(FirstLastLinkedList):
有序链表(SortedLinkedList):
双向链表(DoublyLinkedList):
查找算法:
线性:挨个对比(没有顺序要求)O(n)
二分:每次和最中间的元素比较来缩小范围(有顺序要求)O(n)
排序算法:
假设需要从小到大排序(联系棒球运动员排队):
冒泡:向后两两比较交换,最大的在最后面 ,最笨,O(n^2)
选择:向后,两两比较,找到最小与右边无序的首个元素交换 ,在冒泡的基础上少了个交换,聪明了一点,O(n^2)
插入:向前,两两比较,发现下一个比自己小,则插入在此元素后面(前面的都是有顺序了的),更加聪明了,不用每一次到需要去找到那个最值来进行排序,直接用后面的项挨个排序O(n^2)
简单排序效率对比:得分具体情况,都是随机排序得话,效率为 冒泡 < 选择 < 插入
归并:
在学习归并排序之前先来学习下术语:------merge: merge操作假设现在有两个已经有序了的数组,且这两个数组都是从小到大的顺序,和一个大小为这两个有序数组大小之和的工作数组(workArray),那么现在我们可以利用workArray轻松汇总这两个有序数组的所有项为一个有序数组(放在workArray中),我们只需要进行两次循环;
第一次循环:最开始同下标比较这两个有序数组,将较小的加入到workArray中,之后用较小值数组中的第二个元素一另一数组的未加入到workArray中的第一个元素进行对比,任然是将较小者加入到workArray中,重复此操作,直到有一个数组都比较完了(如果将较小值加入到workArray中后,在有序数组中将这个值删除可认为此时的数组为空);
第二次循环:将还未加入到workArray中的元素全部加入到workArray中 (此时就是移动其中一个数组未加入到workArray中的元素到workArray中);