一、常见算法-01-基本、二分、插值和斐波那契查找
1、基本查找/顺序查找
需求1:定义一个方法利用基本查找,查询某个元素是否存在
数据如下:{131,127,147,81,103,23,7,79}
需求2:定义一个方法利用基本查找,查询某个元素在数组中的索引
要求:不需要考虑数组中元素是否重复
需求3:定义一个方法利用基本查找,查询某个元素在数组中的索引
要求:需要考虑数组中元素是否重复
数据如下:{131,127,147,81,103,23,7,79,81}
2、二分查找/折半查找
- 前提条件:数组中的数据必须是有序的
- 核心逻辑:每次排除一般的查找范围
练习
需求:定义一个方法利用二分查找,查询某个元素在数组中的索引
数据如下: {7,23,79,81,103,127,131,147}
总结:
3、插值查找(二分查找改进)
4、斐波那契查找(二分查找改进)
5、总结:
二、常见算法-02-分块,分块查找,哈希查找
1、分块查找
⭐⭐练习
分块查找 核心思想: 块内无序,块间有序 实现步骤: 1.创建数组blockArr存放每一个块对象的信息 2.先查找blockArr确定要查找的数据属于哪一块 3.再单独遍历这一块数据即可
2、扩展的分块查找(无规律的数据)
3、扩展的分块查找(查找的过程中还需要添加数据)
三、常见算法-03-冒泡排序和选择排序
1、冒泡排序
冒泡排序:相邻两个数据两两比较,小的放前面,大的放后面。
2、选择排序
选择排序:从0索引开始,拿着每一个索引商的元素跟后面的元素一次比较,小的放前面,大的放后面,一次类推。
四、常见算法-04-插入排序和递归算法
1、插入排序
将0索引的元素到N索引的元素看做是有序的,把N+1索引的元素到最后一个当成是无序的。
遍历无序的数据,将遍历到的元素插入有序序列中适当的位置,如遇到相同数据,插在后面。
N的范围:0~最大索引
2、递归算法
递归值得是方法中调用方法本身的现象。
递归算法的作用
把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算
书写递归的两个核心:
找出口:什么时候不再调用方法。
找规则:如何把大问题变成规模较小的问题
递归的注意点:递归一定要有出口,否则就会出现内存溢出
练习------递归求和
需求:求1~100之间的和
练习------递归求阶乘
需求:用递归求5的阶乘,并把结果在控制台输出
5!= 5*4*3*2*1 100!= 100*99*98*97*96....*2*1;
五、常见算法-05-快速排序
练习------快速排序
第一轮:以e索引的数字为基准数,确定基准数在数组中正确的位置。
比基准数小的全部在左边,比基准数大的全部在右边。
后面以此类推。
//结果:1,2,3,4,5,6,7,8,9,10
总结
六、Arrays
1、Lambda表达式的标准格式
Lambda表达式是JDK8开始后的一中新语法形式。
|--------------------|----------------------------------------------------|
| ( ) ->{ } | * ()对应着方法的形参 * -> 固定格式 * {} 对应着方法的方法体 |
函数式编程函数式编程(Functional programming)是一种思想特点。
函数式编程思想,忽略面向对象的复杂语法,强调做什么,而不是谁去做。
而我们要学习的Lambda表达式就是函数式思想的体现。
2、总结:
1、Lambda表达式的基本作用?
简化函数式接口的匿名内部类的写法。
2、Lambda表达式有什么使用前提?
必须是接口的匿名内部类,接口中只能有一个抽象方法
3、Lambda的好处?
Lambda是一个匿名函数
我们可以把Lambda表达式理解为是一段
可以传递的代码,它可以写出更简洁、更灵活的代码,作为一种更紧
凑的代码风格,使Java语言表达能力得到了提升。
3、Lambda表达式的省略写法
省略核心:可推导,可省略
- 参数类型可以省略不写。
- 如果只有一个参数,参数类型可以省略,同时()也可以省略。
- 如果Lambda表达式的方法体只有一行,大括号,分号,return可以省略不写,需要同时省略。
七、五道算法题
练习1------Lambda表达式简化Comparator接口的匿名形式
定义数组并存储一些字符串,利用Arrays中的sort方法进行排序
要求: 按照字符串的长度进行排序,短的在前面,长的在后面。
(暂时不比较字符串里面的内容)
练习2------按照要求进行排序
定义数组并存储一些女朋友对象,利用Arrays中的sort方法进行排序
要求1:属性有姓名、年龄、身高。
要求2:按照年龄的大小进行排序,年龄一样,按照身高排序,身高一样按照姓名的字母进行排序。
(姓名中不要有中文或特殊字符,会涉及到后面的知识)创建Text类
或者用
练习3------不死神兔
有一个很有名的数学逻辑题叫做不死神兔问题,有一对兔子,从出生后第三个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第十二个月的兔子对数为多少?
规律:从第三个数据开始,是前两个数据和 (斐波那契数列)
练习4------猴子吃桃子
有一堆桃子,猴子第一天吃了其中的一半,并多吃了一个!以后每天猴子都吃当前剩下来的一半,然后再多吃一个,第10天的时候(还没吃),发现只剩下一个桃子了,请问,最初总共多少个桃子?
练习5------爬楼梯
可爱的小明特别喜欢爬楼梯,他有的时候一次爬一个台阶,有的时候一次爬两个台阶。
如果这个楼梯有20个台阶,小明一共有多少种爬法呢?