数据结构与算法

基础

算法(algorithm;算法),在数学(算学)和计算机科学之中,指一个被定义好的、计算机可施行其指示的有限步骤或次序,常用于计算、数据处理和自动推理。算法是有效方法,包含一系列定义清晰的指令,并可于有限的时间及空间内清楚的表述出来。

冒泡排序

原理

比较两个相邻的元素,将值大的元素交换到右边

实现

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
public class BubbleSort {

public static void main(String[] args) {
int[] arr = {3, 5, 2, 1, 8, 9};
print(arr);
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - 1; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
}
}
}
print(arr);
}

public static void swap(int[] arr, int i, int j) {
int tmp = arr[j];
arr[j] = arr[i];
arr[i] = tmp;
}

public static void print(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
System.out.println();
}
}

选择排序

原理

每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class SelectionSort {

public static void main(String[] args) {
int[] arr = {4, 6, 2, 9, 1, 7, 3, 8};
print(arr);
for (int i = 0; i < arr.length; i++) {
int min = i;
for (int j = i; j < arr.length; j++) {
if (arr[min] > arr[j]) {
min = j;
}
}
swap(arr, i, min);
}
print(arr);
}

}

插入排序

原理

将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增 1 的有序表

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class InsertionSort {

public static void main(String[] args) {
int[] arr = {5, 3, 8, 2, 9, 7, 4, 1};
print(arr);
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i; j >= 0; j--) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
}
}
}
print(arr);
}

}

希尔排序

原理

希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。

实现

归并排序

思想

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案”修补”在一起,即分而治之)。

原理

实现

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
55
56
57
58
public class MergeSort {

public static void main(String[] args) {
int[] data = {2, 4, 5, 7, 9, 1, 3, 6, 8, 9};
int left = 4;
int right = 9;
sort(data, left, right);
print(data);
}

private static void sort(int[] data, int left, int right) {
int[] tmp = new int[data.length];
int i = 0;
int j = left + 1;
int k = 0;

while (k < data.length && i < data.length / 2 && j < data.length) {
if (data[i] < data[j]) {
tmp[k] = data[i];
i++;
} else {
tmp[k] = data[j];
j++;
}

k++;
}

// 处理左边剩余部分
while (i <= left) {
tmp[k] = data[i];
i++;
k++;
}

// 处理右边剩余部分
while (j <= right) {
tmp[k] = data[j];
j++;
k++;
}

// 将数据复制给原数组
for (int n = 0; n < tmp.length; n++) {
data[n] = tmp[n];
}

print(tmp);
}


public static void print(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
System.out.println();
}
}

参考

Author: suce
Link: https://haoubox.cn/2021/08/23/数据结构与算法/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.