大顶堆
完全二叉树:数据从上到下,从左到右
大顶堆:父节点的值大于或等于其左右节点的值
堆顶元素:arr[0] 堆底元素arr[arr.length - 1]
构建大顶堆:
1.定义parent游标指向该节点
2.定义parent的左孩子child, child = 2*parent + 1 判断有没有左孩子,如果没有该节点符合大顶堆
3.检测有没有右孩子
4.如果有右孩子,左右孩子进行比较,让child指向左右孩子中的最大值
5.父子节点进行比较
6.如果父节点值大,该节点符合大顶堆,继续向前检测
7.如果子节点值大,父子节点进行交换,完成之后parent指向child,child指向左右孩子最大值
8.继续parent与child进行比较,直到parent值大或者child为空
时间复杂度:O(nlogn)
归并排序
先拆分再合并,在合并的过程中借助临时空间进行排序
拆分:从中间位置拆开,数据分成左右两部分,继续拆分,直到拆分成一个一个的时候停止
数组扩容
1.在数组长度不够时,创建一个新的比原来数组更长的新数组
2.让原数组中的数字依次复制到新数组当中
3.让arr指向brr,数据存入
数组插入
最后位置插入
1,判断现在数组有没有位置,如果没位置了考虑扩容
用size记录当前数组有效数据的个数,判断满没满就是看size和arr.length是否相等,相等则满了,考虑扩容,不等则可以添加,size指向有效数据的后一位
2,在下标是size的位置插入,size++
指定位置插入
1,判断位置的取值是否合理【0,size】
2,判断数组有没有位置
用size记录有效数据的个数,判断满没满就是看size和arr.length是否相等,相等则满课,考虑扩容,不等则可以添加
3,eg:在下标为4的位置插入
把原来的数组当中想要插入的位置及其之后的数据,按照从后往前的位置,统一从后向前移动一位,避免数据被覆盖
数据移动完成之后,原来的数据就不怕被覆盖掉,在目标位置插入新数据 size++
数组的删除
把数据覆盖掉,有效数据长度减少
指定位置删除
1,判断删除位置是否合理【0,size-1】
2,目标位置之后的数据,以从前到后的顺序整体向前覆盖 size--
时间复杂度O(n)
指定数据删除
eg:删除数组当中的2
1,首先找到要删除的数据,从后往前找,找到后记录其所在位置
2,目标位置之后的数据,按照从前到后的顺序,统一向前覆盖
3,size--,继续向前查找要删除的数据
找O(n) + 删O(n) = O(n)
补充:双指针
慢指针:需要更新的下标
快指针:获取新数组所需要的元素
如果fast指针遇到要删除的元素,直接跳过,fast++
否则将该值赋值给慢指针,fast++,slow++
size = slow
有序数组插入数据
找位置强行插入
1,判断现在数组有没有位置
用size记录当前数组有效数据的个数,判断满没满就是看size和arr.length是否相等,相等则满了,考虑扩容,不等则可以添加
2,【数组有效长度为0时】:arr[0]直接插入 size++
【要插入的为最大值】:value>arr[size-1] arr[size]直接插入 size++
【其他情况】:和指定位置插入一样,先找位置,找到第一个比插入数据大的,即为目标位置
目标位置及其之后的数据,按照从后往前的位置,依次向后移动,size++
构建链表
尾插法
1.判断head是否为空,如果为空直接插入
2.如果不为空,定义游标遍历整个链表,找到链表当中最后一个节点(最后一个节点的next域为null)
3.插入 i ->next = node
头插法
1.判断head是否为空,如果为空直接插入
2.如果不为空,新节点的next域将链表当中的第一个节点地址存下来 node ->next = head
3.head指向新节点 head = node
遍历链表
定义游标 i 遍历 i = head
输出当前节点的值 i->value
i = i ->next
直到 i 为空,整个遍历完成
输出链表的长度
定义一个变量count,每遍历一个数据,让变量+1, 最后输出变量的值
查找元素
每遍历一个数据,查看当前节点的value域和目标值是否相等,相等则找到了,不能查找下一个
指定位置插入
1.判断插入位置是否合理【0.链表长度】
2,如果在0号位置插入 头插法
3.如果在最后位置插入 尾插法
4.中间位置插入 先找出当前位置的节点 i 以及目标位置前一个节点pre
i 成为新节点的下一个节点 node->next = i
新节点成为pre的后一个节点 pre->next = node
指定位置删除
1.判断删除位置是否合理【0.链表长度-1】
2.删除位置为0 head = head ->next
3.删除中间位置的节点 先找出目标位置节点 i 以及目标位置前一个节点 pre
pre ->next = i->next
4.删除最后一个节点 pre ->next = null
先进后出
限制线性表(数组,链表)中元素的插入和删除。插入和删除在同一端进行
允许插入和删除的一端为变化端,称为栈顶
另外一段称为栈底
插入数据:定义栈顶初始值为-1,栈顶++
出栈:数据取出,栈顶--
判断栈满:每一次入栈的都要判断栈是否满,满了之后考虑扩容
设置数组长度为maxSize,则maxSize指向数组最后一个位置
插入之前判断栈顶和maxSize-1是否相等,相等则栈满
判断栈空:每一次出栈前都要判断栈是否空,栈顶为-1则表示栈空