Skip to content

Commit b0387ea

Browse files
committed
Initial commit
0 parents  commit b0387ea

9 files changed

Lines changed: 432 additions & 0 deletions

File tree

.idea/misc.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/modules.xml

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Algorithm.iml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<module type="JAVA_MODULE" version="4">
3+
<component name="NewModuleRootManager" inherit-compiler-output="true">
4+
<exclude-output />
5+
<content url="file://$MODULE_DIR$">
6+
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
7+
</content>
8+
<orderEntry type="inheritedJdk" />
9+
<orderEntry type="sourceFolder" forTests="false" />
10+
</component>
11+
</module>

src/sort/BubbleSort.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package sort;
2+
3+
/**
4+
* 冒泡排序
5+
*/
6+
public class BubbleSort {
7+
8+
public static void main(String[] args) {
9+
int[] arr = {2, 12, 43, 56, 32, 12, 14};
10+
BubbleSort.sort(arr);
11+
}
12+
13+
public static void sort(int[] arr) {
14+
// 记录已经排过序的位置,即每次可以少比较一次
15+
int end = arr.length;
16+
// 每次取一个和其他比较
17+
for (int k = 0; k < arr.length; k++) {
18+
for (int i = 1; i < end; i++) {
19+
// 小则交换位置
20+
if (arr[i - 1] > arr[i]) {
21+
int temp = arr[i];
22+
arr[i] = arr[i - 1];
23+
arr[i - 1] = temp;
24+
}
25+
}
26+
end--;
27+
}
28+
for (int i : arr) System.out.print(i + " ");
29+
}
30+
31+
}

src/sort/InsertionSort.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package sort;
2+
3+
/**
4+
* 直接插入排序
5+
*/
6+
public class InsertionSort {
7+
8+
public static void main(String[] args) {
9+
int[] arr = {1,4,56,3,12,54,76,98,100,98,12,13,87,5,3,23};
10+
InsertionSort.sort(arr);
11+
}
12+
13+
public static void sort(int[] arr){
14+
// 从下标为1的开始
15+
for (int i = 1; i < arr.length; i++){
16+
// 只考虑已插入的,即之和下标i之前的已经排序好的比较
17+
for (int j = i; j > 0; j--){
18+
if (arr[j] < arr[j-1]){
19+
int temp = arr[j];
20+
arr[j] = arr[j-1];
21+
arr[j-1] = temp;
22+
}
23+
}
24+
}
25+
for (int i:arr) System.out.print(i + " ");
26+
}
27+
28+
}

src/sort/MergeSort.java

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package sort;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
/**
7+
* 归并排序
8+
* 没有考虑性能,使用了list
9+
*/
10+
public class MergeSort {
11+
12+
public static void main(String[] args) {
13+
List<Integer> arr = new ArrayList<>();
14+
for (int i = 0; i < 1000; i++){
15+
arr.add((int)(Math.random()*1000));
16+
}
17+
MergeSort.merge(arr, 0, arr.size() - 1);
18+
System.out.println(arr);
19+
}
20+
21+
// 分治
22+
public static void merge(List<Integer> arr, int left, int right){
23+
// 如果left == right说明已经不可再分割
24+
if (left == right) return;
25+
// 获取中间的下标
26+
int mid = (left + right) / 2;
27+
// 数组左半部分再分治
28+
merge(arr, left, mid);
29+
// 数组右半部分再分治
30+
merge(arr, mid + 1, right);
31+
// 进行排序
32+
sort(arr, left, mid, right);
33+
}
34+
35+
public static void sort(List<Integer> arr, int left, int mid, int right){
36+
// 标记位.当前一个right的元素已经插入到left的某一位flag,
37+
// 则表示该位flag之前的left中的元素对于其他right中的其他元素都不需要再进行无意义的比较
38+
// 因为right的剩余元素恒大于flag之前的元素
39+
int flag = left;
40+
// 标记位,用于记录动态变化中的left中最后一个元素下标
41+
// 因为right中的元素插入到left中会使原mid对应的元素后移
42+
int fakeMid = mid;
43+
for (int i = mid + 1; i <= right; i++){ // 从right中依次取出一个
44+
for (int j = flag; j <= fakeMid; j++){ // 将right中的元素和left中的每个元素比较
45+
if (arr.get(i) < arr.get(j)){
46+
Integer remove = arr.remove(i);
47+
arr.add(j,remove);
48+
// 原mid对应元素后移一位
49+
fakeMid++;
50+
// 记录right中元素插入位置,下一个right中元素从该位置和left中元素开始比较
51+
flag = j;
52+
break;
53+
}
54+
flag = j;
55+
}
56+
// 如果right中某个元素比left中所有元素都大,则表示其后的right的元素恒大于left中元素
57+
// 则不需要再进行排序
58+
if (flag > fakeMid) break;
59+
}
60+
}
61+
62+
}

src/sort/QuickSort.java

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package sort;
2+
3+
/**
4+
* 快速排序 没有达到要求
5+
*/
6+
public class QuickSort {
7+
8+
public static void main(String[] args) {
9+
int[] arr = {2, 3, 24, 123, 333, 445, 521, 663, 723, 856, 1765, 3312};
10+
// for (int i = 0; i < 100; i++) arr[i] = (int)(Math.random()*100);
11+
long start = System.currentTimeMillis();
12+
QuickSort.merger(arr, 0, arr.length - 1);
13+
for (int i : arr
14+
) {
15+
System.out.print(i + " ");
16+
}
17+
System.out.println("\n时长:" + (System.currentTimeMillis() - start));
18+
}
19+
20+
private static void merger(int[] arr, int left, int right) {
21+
// 递归到剩余一个时停止递归
22+
// 由于会出现left = flag(flag左侧没有任何元素),因此merger(arr, left, flag - 1)会导致left > right的情况出现
23+
if (left >= right) return;
24+
// 每次以第一个值为flag
25+
int flag = left;
26+
// 用于交换位置的临时变量
27+
int temp;
28+
// 会变化的left,right
29+
// 即currentLeft的左边的值已经和flag比较过,并且一定小于flag的值
30+
// 所以下一轮比较就可以不再重复比较了,直接从currentLeft开始比较
31+
int currentLeft = left;
32+
int currentRight = right;
33+
while (currentLeft + 1 >= flag && currentRight - 1 >= flag) {
34+
// 从后向前找第一个比temp小的
35+
int i = currentRight;
36+
while (i >= flag) {
37+
if (arr[flag] > arr[i]) {
38+
temp = arr[i];
39+
arr[i] = arr[flag];
40+
arr[flag] = temp;
41+
flag = i;
42+
// -- 和 =i 一样
43+
currentRight--;
44+
break;
45+
}
46+
// 不符合就左移
47+
currentRight = i;
48+
i--;
49+
}
50+
// 从前向后找第一个比temp大的
51+
int j = currentLeft;
52+
while (j < flag) {
53+
if (arr[flag] < arr[j]) {
54+
temp = arr[j];
55+
arr[j] = arr[flag];
56+
arr[flag] = temp;
57+
flag = j;
58+
// ++ 和 =j 一样
59+
currentLeft++;
60+
break;
61+
}
62+
// 不符合就右移
63+
currentLeft = j;
64+
j++;
65+
}
66+
}
67+
merger(arr, left, flag - 1);
68+
merger(arr, flag + 1, right);
69+
}
70+
}

src/sort/SelectionSort.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package sort;
2+
3+
/**
4+
* 选择排序
5+
*/
6+
public class SelectionSort {
7+
8+
public static void main(String[] args) {
9+
int[] arr = {1,3,4,2,5,6,11,77,32,98,666,78,54,32,45,2};
10+
SelectionSort.sort(arr);
11+
}
12+
13+
public static void sort(int[] arr){
14+
for (int i = 0; i < arr.length; i++){
15+
// 用于记录每次最小值的下标
16+
int index = i;
17+
for (int j = i+1; j < arr.length; j++){
18+
if (arr[index] > arr[j]) index = j;
19+
}
20+
int temp = arr[index];
21+
arr[index] = arr[i];
22+
arr[i] = temp;
23+
}
24+
for (int i:arr) System.out.print(i + " ");
25+
}
26+
27+
}

0 commit comments

Comments
 (0)