【快速排序】
原理:快速排序采⽤的是⼀种分治的思想,它先找⼀个基准数(⼀般选择第⼀个值),然后将⽐这个基准数⼩的数字都放到它的左边,然后再递归调⽤,分别对左右两边快速排序,直到每⼀边只有⼀个数字.整个排序就完成了.
复杂度:O(n)
特点:快速排序是我们平常最常使⽤的⼀种排序算法,因为它速度快,效率⾼,是最优秀的⼀种排序算法.
【冒泡排序】
原理:冒泡排序其实就是逐⼀⽐较交换,进⾏⾥外两次循环,外层循环为遍历所有数字,逐个确定每个位置,⾥层循环为确定了位置后,遍历所有后⾯没有确定位置的数字,与该位置的数字进⾏⽐较,只要⽐该位置的数字⼩,就和该位置的数字进⾏交换.
复杂度:O(n^2),最佳时间复杂度为O(n)
特点:冒泡排序在我们实际开发中,使⽤的还是⽐较少的.它更加适合数据规模⽐较少的时候,因为它的效率是⽐较低的,但是优点是逻辑简单,容易让我们记得.
直接插⼊排序:
原理:直接插⼊排序是将从第⼆个数字开始,逐个拿出来,插⼊到之前排好序的数列⾥.
复杂度:O(n^2),最佳时间复杂度为O(n)
直接选择排序:
原理:直接选择排序是从第⼀个位置开始遍历位置,找到剩余未排序的数据⾥最⼩的,找到最⼩的后,再做交换
复杂度:O(n^2)
特点:和冒泡排序⼀样,逻辑简单,但是效率不⾼,适合少量的数据排序。
a. 线性结构的优点是可以实现随机读取,时间复杂度为O(1),空间利⽤率⾼,缺点是进⾏插⼊和删除操作时⽐较麻烦,时间复杂度为O(n),同时容量受限制,需要事先确定容量⼤⼩,容量过⼤,浪费空间资源,过⼩不能满⾜使⽤要求,会产⽣溢出问题。
b. 链式存储结构的优点主要是插⼊和删除⾮常简单,前提条件是知道操作位置,时间复杂度是O(1),但如果不知道操作位置则要定位元素,时间复杂度为O(n),没有容量的限制,可以使⽤过程中动态分配的分配内存空间,不⽤担⼼溢出问题,但是它并不能实现随机读取,同时空间利⽤率不⾼。
树节点:
b. 递归先序遍历:先输出节点的值,再递归遍历左右⼦树。中序和后序的递归类似,改变根节点输出位置即可。
c. 递归中序遍历:过程和递归先序遍历类似
d. 递归后序遍历:
Collections.reverse(linkedList);
⼆叉树
查找:
缺陷:
特点:是⼀种⾃平衡的⼆叉查找树,除了符合⼆叉树的特点之外,还符合以下⼏点:
这些规则保证了红⿊树的⾃平衡。
红⿊树从根到叶⼦的最长路径不会超过最短路径的2倍。
提⾼寻址效率。
添加删除:通过⾃旋来保证平衡
b-tree(⽂件系统)
B树也称B-树,它是⼀颗多路平衡查找树。我们描述⼀颗B树时需要指定它的阶数,阶数表示了⼀个结点最多有多少个孩⼦结点,⼀般⽤字⺟m表示阶数。当m取2时,就是我们常⻅的⼆叉搜索树。
定义:
b+tree(mysql索引)
定义:
TreeMap实现了红⿊树的结构。
HashMap:
1、很简单的计算:由于默认的加载因⼦是0.75 ,那么,此时map的阀值是 16*0.75 = 12,即添加第13个键值对
的时候,map的容量会扩充⼀倍。
2、确实如此,但是为了尽可能第减少桶中的Entry链表的长度,以提⾼HashMap的存取性能,确定的这个经验值。如果读者你对存取效率要求的不是太⾼,想省点空间的话,你可以new HashMap(int initialCapacity, float loadFactor)构造⽅法将这个因⼦设置得⼤⼀些也⽆妨。
put流程:
a. 获取这个Key的hashcode值,根据此值确定应该将这⼀对键值对存放在哪⼀个桶中,即确定要存放桶的索引;
b.遍历所在桶中的Entry链表,查找其中是否已经有了以Key值为Key存储的Entry 对象,
c1. 若已存在,定位到对应的Entry,其中的Value值更新为新的Value值;返回旧值;
c2.若不存在,则根据键值对创建⼀个新的Entry 对象,然后添加到这个桶的Entry
d.当前的HashMap的⼤⼩(即Entry节点的数⽬)是否超过了阀值,若超过了阀值(threshold), 则增⼤HashMap的容量(即Entry[] table 的⼤⼩),并且重新组织内部各个Entry 排列。
get流程:
a. 获取这个Key的hashcode值,根据此hashcode值决定应该从哪⼀个桶中查找;
b.遍历所在桶中的Entry链表,查找其中是否已经有了以Key值为Key存储的Entry 对象,
c1. 若已存在,定位到对应的Entry,返回value c2. 若不存在,返回null;