这里再补充一条本博客的方法论:精简

  • 只有精简才能一语中的,描绘出事物的本质,过于冗长的博客是谁不不愿意看的。

SearchAlgorithm查找算法

算法其实都是有固定模版的,至少从我考研到现在看来。以及工作之后的一些应用场景,好记性不如烂笔头,拿一些好用算法模版写到自己能随时看到的地方比自己工作胡乱在网上找,或者自己凭感觉写要好的多。

二分查找算法

精华:求mid = left + right / 2, 如果mid > key 则 right = mid - 1, 反之left = mid + 1

代码案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*
二分查找算法
精华:求mid = left + right / 2, 如果mid > key 则 right = mid - 1, 反之left = mid + 1
*/
public class BinarySearchAlgorithm {
public static void main(String[] args) {
// 1, 定义一个有序的数组
int[] arr = {88, 66, 55, 37, 25, 23, 12, 6, 3, 1};
int key = 66;
// 2, 在循环查找之前,先准备两个索引,分别记录要查询的范围中的左右两边
for (int left = 0, right = arr.length -1 ; left <= right;) {
// 只要开始循环,就立刻计算中间索引
int mid = (left + right) / 2;
// 判断要查询的元素和中间索引位置的元素大小关系
if (key > arr[mid]){
// 说明要查找的元素在中间值的左边,修改右边的索引
right = mid - 1;
}else if (key < arr[mid]){
left = mid + 1;
}else {
System.out.println(key + "在:" + mid + "索引位置找到了!");
return;
}
}
System.out.println("要查找的元素不在数组中");
}
}

SortAlgorithm排序算法

冒泡排序是最经典的算法,其次还有选择排序算法。总之算法很多,拿一两个比较常用的记一下还是很好的。

BubbleSort冒泡排序

精华:外层循环控制排序次数,内层循环控制元素大小比较

Tips:

  • 外层:int i = 0; i < arr.length; i++
  • 内层:int j = 0; j < arr.length - i -1; j++

代码案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class BubbleSortAlgorithm {
public static void main(String[] args) {
// 1, 准备一个无序数组
int[] arr = {5, 8, 7, 8, 9, 5, 7, 3, 5, 8, 2, 9, 1};
// 2, 冒泡排序,需要使用循环嵌套,外层循环控制排序轮数,需要进行length - 1 轮
for (int i = 0; i < arr.length; i++) {
// 3, 内层循环控制相邻的两个元素比较,大的放右边,小的放左边
// -i 的目的是为了提升排序的性能,前面几轮已经排好序的元素,无需再次排序
// -1 的目的是为了让 j + 1索引不会越界
for (int j = 0; j < arr.length - i -1; j++) {
// 比较 j索引和 j+1索引位置的元素
if (arr[j] > arr[j + 1]){
// 交换
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
System.out.println(Arrays.toString(arr));
}
}

SelectionSort选择排序

精华:使用当前位置的元素和后面的每一个位置的元素都比较一次,如果发现更小的元素,则交换到当前位置

图示:

image-20240127182054739

代码案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class SelectionSortAlgorithm {
public static void main(String[] args) {
// 1, 准备一个无序数组
int[] arr = {4, 7, 8, 9, 5, 6, 8, 9, 4, 2, 1};
// 2, 使用循环嵌套,外循环控制轮数
for (int i = 0; i < arr.length - 1; i++) {
// 3, 使用当前位置的元素,和后面的每一个元素都比较一次, 如果发现了更小的元素则交换位置
for (int j = i + 1; j < arr.length; j++) {
// 4, 使用i索引位置和 j 的每个位置都比较一次
if (arr[i] > arr[j]){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
System.out.println(Arrays.toString(arr));
}
}

Arrays工具类

Arrays工具类中其实就已经封装好了排序算法,所以直接使用吧!

概述

1
是java提供的一个专门用于操作数组的工具类,里面所有的方法都是静态方法;

常用方法

image-20240127182549363

代码案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class MyArrays {
public static void main(String[] args) {
// 1, 二分查找
int[] arr = {2, 5, 6, 8, 9, 22, 55, 77, 99};
int i = Arrays.binarySearch(arr, 8); // 后面的参数是要查找的数据,如果找不到会返回-1
System.out.println(i);
// 2, 复制指定范围的数据
int[] ints = Arrays.copyOfRange(arr, 1, 4);
System.out.println(Arrays.toString(ints));
// 3, 复制指定的个数
int[] arr2 = Arrays.copyOf(arr, 5);
System.out.println(Arrays.toString(arr2));
// 4, 修改数组中的元素
Arrays.setAll(arr, new IntUnaryOperator() {
@Override
public int applyAsInt(int operand) {
return arr[operand] * 3;
}
});
System.out.println(Arrays.toString(arr));
// 5, 排序
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
}
}

Arrays操作对象数组(※)

对存放对象的数组进行排序,有两种方法

  • 方法一:在JavaBean中实现Comparable接口<泛型类-本类类名>(不太灵活,因为可能实体类是别人写的不好修改)
  • 方法二:在Arrays.sort(数组,Comparator比较器对象)方法中,使用匿名内部类表达式(方便灵活)

其实不管那种写法,都遵守一个规则:前减后升序,后减前降序

JavaBean

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
public class Student implements Comparable<Student>{
private String name;
private double height;
private int age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public double getHeight() {
return height;
}

public void setHeight(double height) {
this.height = height;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public Student(String name, double height, int age) {
this.name = name;
this.height = height;
this.age = age;
}

public Student() {
}

// 该方法就是专门用于描述排序规则的方法,编写Student类的人只负责写,不负责调用,由Arrays.sort方法内部负责调用
@Override
public int compareTo(Student o) {
// 使用 this - o 就是升序, 使用 o - this 就是降序
return this.age - o.age;
}

@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", height=" + height +
", age=" + age +
'}';
}
}

方法一&方法二演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.Arrays;
import java.util.Comparator;

public class ArraysTest {
public static void main(String[] args) {
// 对数组中的对象进行排序
Student[] students = new Student[4];
students[0] = new Student("蜘蛛精", 169.5, 23);
students[1] = new Student("紫霞", 163.8, 26);
students[2] = new Student("至尊宝", 163.8, 24);
students[3] = new Student("抓根宝", 167.5, 27);

// 直接进行排序会报错(因为Java不知道按照哪个关键字进行排序)
Arrays.sort(students);
System.out.println(Arrays.toString(students));

// 方法一:在JavaBean中实现Comparable接口<泛型类-本类类名>(不太灵活,因为可能实体类是别人写的不好修改)

// 方法二:在Arrays.sort(数组,Comparator比较器对象)方法中,使用匿名内部类表达式(方便灵活)
Arrays.sort(students, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
// 前减后升序, 后减前降序
return o2.getAge() - o1.getAge();
}
});
System.out.println(Arrays.toString(students));
}
}