JAVA数据结构与算法

数组:

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中);

在这里插入图片描述

在这里插入图片描述

正式归并排序概念:现在有一个和排序数组同样大小的workspace(任然选用数组作为workspace),一直对半拆分数组,直到子数组只有一项为止(此时不再进行递归的条件),此时认为只有一项的子数组是有序的,然后进行merge操作,得到一个新的有序子数组,再进行merge操作,最终得到一个完整的有序数组,排序完毕。时间复杂度:O(NlogN)。(因为最终代码是由递归来实现,且又有merge操作,所以叫归并排序)

在这里插入图片描述

递归

概念:方法进行自调用。

典型例子:1~n的累加,阶乘,递归二分查找,归并排序,汉诺塔。

去递归:任何递归都可以用stack来代替,简单的也可以用循环来代替,至于为甚么不是所有的都可以用循环来代替,目前还不清除,猜测可能是实现太复杂,和难吧。

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值