当前位置: 首页 > news >正文

Java的常见算法和Lambda表达式

基本查找

package search.code;public class code1 {public static void main(String[] args) {//基本查找//核心//从0索引开始,一直往后查找,直到找到为止//需求:定义一个方法利用基本查找,查询某个元素是否存在//数据如下:{131, 127, 147, 81, 103, 23, 7, 79, 81}int[] arr = {131, 127, 147, 81, 103, 23, 7, 79, 81};int num = 81;//调用方法System.out.println(basicSearch(arr,num));}public static boolean basicSearch(int[] arr,int num){//利用基本查找,查询某个元素是否存在for (int i = 0; i < arr.length; i++) {if (arr[i]==num){return true;}}return false;}
}
运行结果:
true

顺序查找:

package search.code;import java.util.ArrayList;
import java.util.List;public class code2 {public static void main(String[] args) {//需求:定义一个方法利用基本查找,查询某个元素在数组中的索引//不需要考虑数组中元素是否重复int[] arr = {131, 127, 147, 81, 103, 23, 7, 79, 81, 81};int num = 81;//调用方法System.out.println(returnindex(arr, num));//需求:定义一个方法利用基本查找,查询某个元素在数组中的索引//需要考虑数组中元素是否重复}public static List<Integer> returnindex(int[] arr, int num) {List<Integer> indexs = new ArrayList<>();for (int i = 0; i < arr.length; i++) {if (arr[i] == num) {indexs.add(i);}}return indexs;}
}

运行结果:
[3, 8, 9]
二分查找/折半查找
在这里插入图片描述
二分查找/折半查找
在这里插入图片描述
二分查找/折半查找的实验代码:

package search.code;public class code3 {public static void main(String[] args) {//定义一个数组int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//定义一个要查找的元素//调用方法int searchnum = search(arr, 10);System.out.println(searchnum);}public static int search(int[] arr, int num) {//定义两个变量去找查找要的数据int min = 0;int max = arr.length - 1;while (true) {//定义一个中间变量//进行判断if (min > max) {return -1;}//查找min和max的中间位置值int mid = (min + max) / 2;//拿着mid和要查找的元素再次进行判断//mid在要查找元素的左边//mid在要查找元素的右边//mid在要查找元素指向一个元素if (arr[mid] > num) {max = mid - 1;} else if (arr[mid] < num) {min = mid + 1;}else {return mid;}}}
}

运行结果:
9
二分查找总结:
在这里插入图片描述
二分查找改进与提升效率
插值查找
要求(数据分布比较均匀,不然反而会降低效率)
在这里插入图片描述
斐波那契查找:
在这里插入图片描述
三种查找方式的总结:
在这里插入图片描述
分块查找:
在这里插入图片描述
核心思路:先确定要查找的元素在哪一块,然后在块内挨个查找
分块查找的模式图:
在这里插入图片描述
总结
在这里插入图片描述
冒泡排序
在这里插入图片描述
冒泡排序

package search.code;public class Bubbledemo1 {public static void main(String[] args) {//定义数组int[] arr = {2, 1, 4, 3, 5};//利用冒泡排序进行排序//外循环for (int i = 0; i < arr.length - 1; i++) {for (int j = 0; j < arr.length - j; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}//遍历数组printArr(arr);}private static void printArr(int[] arr) {for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}

运行结果:
1 2 3 4 5

选择排序
在这里插入图片描述
在这里插入图片描述
选择排序:

package search.code;public class Selectiondemo1 {public static void main(String[] args) {//定义数组int[] arr = {2, 1, 4, 3, 5};//利用选择排序进行排序for (int i = 0; i < arr.length - 1; i++) {for (int j = i + 1; j < arr.length; j++) {if (arr[i] > arr[j]) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}}printArr(arr);}private static void printArr(int[] arr) {for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}

运行结果:
1 2 3 4 5
插入排序:
在这里插入图片描述
插入排序:

package search.code;public class Insertdemo1 {public static void main(String[] args) {//定义数组int[] arr = {2, 3, 4553187, 67, 561, 32, 90, 14, 3, 215, 23, 413131, 9, 5354, 1, 2};int startIndex = -1;for (int i = startIndex; i < arr.length; i++) {//记录当前插入数据的索引int j = i;while (j > 0 && arr[j] < arr[j - 1]) {int temp = arr[j];arr[j] = arr[j - 1];arr[j - 1] = temp;j--;}}//遍历数组printArr(arr);}private static void printArr(int[] arr) {for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}

运行结果:
1 2 2 3 3 9 14 23 32 67 90 215 561 5354 413131 4553187

快速算法
在这里插入图片描述
递归的作用:
在这里插入图片描述
书写递归的两个核心:
在这里插入图片描述

求1-100之间的和

package search.code;public class Sumdemo1 {public static void main(String[] args) {int sum = getSum(100);System.out.println(sum);}private static int getSum(int i) {if (i == 1){return 1;}return i + getSum(i - 1);}
}

运行结果:
5050
递归求阶乘
在这里插入图片描述

package search.code;public class Recursiondemo1 {public static void main(String[] args) {//调用方法int result = getFactorialRecursion(5);System.out.println(result);}//递归求阶乘//5! = 5 * 4 * 3 * 2 * 1private static int getFactorialRecursion(int i) {if (i == 1){return 1;}return i * getFactorialRecursion(i -1);}
}

运行结果:
120
递归的内存图
在这里插入图片描述
快速排序
在这里插入图片描述

package search.code;public class QuickSortdemo1 {public static void main(String[] args) {int[] arr = {4, 6, 7, 12, 1, 68, 89, 9, 23};quickSort(arr, 0, arr.length - 1);printArr(arr);}private static void quickSort(int[] arr, int i, int j) {//定义两个变量记录要查找的范围int startNum = i;int endNum = j;if (startNum > endNum){return;}//记录基准数int baseNum = arr[i];//使用循环找到要交换的数字//利用endNum从后往前找,找到比基准数小的数字while(startNum != endNum) {while (true) {if (endNum <= startNum || arr[endNum] < baseNum) {break;}endNum--;}//利用startNum从前往后找,找到比基准数小的数字while (true) {if (endNum <= startNum || arr[startNum] > baseNum) {break;}startNum++;}int temp = arr[startNum];arr[startNum] = arr[endNum];arr[endNum] = temp;}//当startNum和endNum指向同一个元素时,完成第一轮排序//把基准数归位int temp = arr[i];arr[i] = arr[startNum];arr[startNum] = temp;quickSort(arr,i,startNum - 1);quickSort(arr,startNum + 1,j);}private static void printArr(int[] arr) {for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}

运行结果:
1 4 6 7 9 12 23 68 89
快速排序的使用时间

package search.code;import java.util.Random;public class QuickSortdemo1 {public static void main(String[] args) {printTime();}private static void getRandomArr() {int[] arr = new int[10000];Random r = new Random();for (int i = 0; i < arr.length; i++) {arr[i] = r.nextInt();}}private static void printTime() {long start = System.currentTimeMillis();getRandomArr();long end = System.currentTimeMillis();System.out.println(end - start);}private static void quickSort(int[] arr, int i, int j) {//定义两个变量记录要查找的范围int startNum = i;int endNum = j;if (startNum > endNum){return;}//记录基准数int baseNum = arr[i];//使用循环找到要交换的数字//利用endNum从后往前找,找到比基准数小的数字while(startNum != endNum) {while (true) {if (endNum <= startNum || arr[endNum] < baseNum) {break;}endNum--;}//利用startNum从前往后找,找到比基准数小的数字while (true) {if (endNum <= startNum || arr[startNum] > baseNum) {break;}startNum++;}int temp = arr[startNum];arr[startNum] = arr[endNum];arr[endNum] = temp;}//当startNum和endNum指向同一个元素时,完成第一轮排序//把基准数归位int temp = arr[i];arr[i] = arr[startNum];arr[startNum] = temp;quickSort(arr,i,startNum - 1);quickSort(arr,startNum + 1,j);}private static void printArr(int[] arr) {for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}

运行时间:
1
Lambda表达式

package search.code;import java.util.Arrays;public class Lambdademo1 {public static void main(String[] args) {//初始Lambda表达式Integer[] arr = {1,12,32,2,4,3,7};Arrays.sort(arr,(a,b)->{return a - b;             //升序// return b - a;          //降序});System.out.println(Arrays.toString(arr));}
}

运行结果:
[1, 2, 3, 4, 7, 12, 32]
Lambda表达式的标准格式
在这里插入图片描述
JDK8以后的一种新的语法形式
在这里插入图片描述

注意点:
在这里插入图片描述
必须是函数式接口才能用Lambda表达式简写
总结:
在这里插入图片描述
省略核心:
可推导可省略
Lambda表达式规则:
在这里插入图片描述
Lambda表达式的完全省略式

package search.code;import java.util.Arrays;public class Lambdademo1 {public static void main(String[] args) {//初始Lambda表达式Integer[] arr = {1,12,32,2,4,3,7};Arrays.sort(arr,(a,b)->a-b);System.out.println(Arrays.toString(arr));}
}

运行结果:
[1, 2, 3, 4, 7, 12, 32]

package search.code;import java.util.Arrays;public class Lambdademo2 {public static void main(String[] args) {String[] arr = {"aa","a","aaaaaaaaaa","aa","aaa","aaaa"};//Lambda表达式Arrays.sort(arr,(String o1, String o2) ->o1.length() - o2.length());System.out.println(Arrays.toString(arr));}
}

运行结果:
[a, aa, aa, aaa, aaaa, aaaaaaaaaa]

练习.按照要求排序

在这里插入图片描述
Test

package search.code;import java.util.Arrays;public class GirlFriendTest {public static void main(String[] args) {GirlFriend gf1 = new GirlFriend("xx",18,160);GirlFriend gf2 = new GirlFriend("xy",19,165);GirlFriend gf3 = new GirlFriend("xss",20,168);GirlFriend[] arr = {gf1,gf2,gf3};Arrays.sort(arr,(o1,o2)->(o1.getAge()-o2.getAge()));System.out.println(Arrays.toString(arr));}
}

Javabean:

package search.code;public class GirlFriend {private String name;private int age;private int height;public GirlFriend(){}public GirlFriend(String name,int age ,int height){this.name = name;this.age = age;this.height = height;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}/*** 获取* @return height*/public int getHeight() {return height;}/*** 设置* @param height*/public void setHeight(int height) {this.height = height;}public String toString() {return "GirlFriend{name = " + name + ", age = " + age + ", height = " + height + "}";}
}

运行结果:
[GirlFriend{name = xx, age = 18, height = 160},
GirlFriend{name = xy, age = 19, height = 165},
GirlFriend{name = xss, age = 20, height = 168}]
在这里插入图片描述
在这里插入图片描述

递归的方法:

package kl003.Test6;public class Rabbit1 {public static void main(String[] args) {int sum = getSum(12);System.out.println(sum);}private static int getSum(int month) {if (month == 1 || month == 2){return  1;}else {return getSum(month -1) + getSum(month - 2);}}
}

赋值法:

package kl003.Test6;public class Rabbit1 {public static void main(String[] args) {int sum = getSum(12);System.out.println(sum);}private static int getSum(int month) {if (month == 1 || month == 2){return  1;}else {return getSum(month -1) + getSum(month - 2);}}
}

运行结果:
144
在这里插入图片描述
递归方法

package kl003.Test6;public class Monkey {public static void main(String[] args) {int sum = getSum(9);System.out.println(sum);}private static int getSum(int day) {if (day < 0 || day > 10){return -1;}if (day == 10){return 1;}else {return (getSum(day + 1) + 1) * 2;}}
}

运行结果:1534

在这里插入图片描述

package kl003.Test6;public class Floor {public static void main(String[] args) {int cnt  = getCnt(20);System.out.println(cnt);}private static int getCnt(int floor) {if (floor == 1){return 1;}if (floor == 2){return 2;}return getCnt(floor - 1) + getCnt(floor - 2);}
}

运行结果:
10946
谢谢观看!

相关文章:

  • NMEA定位测试,硬件验证
  • 监控易一体化运维:网络拓扑管理,网络管理高效之道
  • 无人机影像水面拼接、海面拼接
  • Matlab学习合集
  • halcon轮廓处理(不同线段用不同颜色显示)与交点检测
  • Python的文本操作和try语句使用
  • day1 大模型学习 Qwen系列学习
  • 精益数据分析(76/126):最小可行愿景(MVV)与可持续商业模式构建
  • 飞牛fnNAS远程映射盘符
  • MySql添加非空字段时的“伪空”问题
  • JC/T 2387-2024 改性聚苯乙烯泡沫(EPS)复合装饰制品检测
  • 生存资料的多因素分析,如果满 足等比例风险假定, 采用Cox回归; 如果不满足等比例风险假定,则考虑采用 非等比例Cox回归分析研究预后因素的影响
  • 【Pandas】pandas DataFrame round
  • Ubuntu+Docker+内网穿透:保姆级教程实现安卓开发环境远程部署
  • AI智慧高光谱遥感实战精修班暨手撕99个案例项目、全覆盖技术链与应用场景一站式提升方案
  • 加工生产调度(Johnson算法)
  • 重读《人件》Peopleware -(11)Ⅱ 办公环境 Ⅳ 插曲:生产力测量与不明飞行物
  • 浏览器原生 Web Crypto API 实现 SHA256 Hash 加密
  • 架构实践中,指标体系如何科学建立?构建指标体系的五层结构模型是什么?不同架构风格下的指标体系有怎样的差异?
  • 嵌入式软件架构规范之 - 分层设计
  • 苏州论坛型网站建设/seo网站外链工具
  • 网站建设策划书5000字/如何推广网站方法
  • 如何查到别人的网站做哪些竞价词/怎么优化推广自己的网站
  • 职业生涯规划大赛怎么准备/5g网络优化
  • 淘宝联盟上怎么建设网站/app推广渠道在哪接的单子
  • phpcms做网站页面开发/怎么分析一个网站seo