Skip to content

Commit cfcc2e8

Browse files
author
tianbin
committed
class04 归并排序
1 parent e585618 commit cfcc2e8

16 files changed

+400
-13
lines changed

src/main/java/algorithm_practice/algorithmzuo/a_新手班/class01/Code03_SelectionSort.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import common.util.SysOut;
66
import common.util.SysRandom;
77
import common.util.SystemUtil;
8+
import org.junit.Assert;
89
import org.junit.Test;
910

1011
import static common.util.SwapUtil.swap;
@@ -19,12 +20,11 @@ public void testCase() {
1920
for (int i = 0; i < CommonConstants.TEST_CASE_COUNT; i++) {
2021
int arr[] = SysRandom.randomArr();
2122
SysOut.printArray(arr);
22-
int[] tmp = CompareUtils.copyArray(arr);
2323
selectSort(arr);
2424
SysOut.printArray(arr);
2525
if (!CompareUtils.isSortAsc(arr)) {
26-
System.out.println("!!!有问题");
27-
SysOut.printArray(tmp);
26+
SysOut.println("。。。有问题❗️❗️❗️");
27+
Assert.assertTrue(false);
2828
}
2929

3030
SystemUtil.printLiteCuttingLine();

src/main/java/algorithm_practice/algorithmzuo/a_新手班/class01/Code04_BubbleSort.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import common.util.SysOut;
66
import common.util.SysRandom;
77
import common.util.SystemUtil;
8+
import org.junit.Assert;
89
import org.junit.Test;
910

1011
import static common.util.SwapUtil.swap;
@@ -19,12 +20,11 @@ public void testCase() {
1920
for (int i = 0; i < CommonConstants.TEST_CASE_COUNT; i++) {
2021
int arr[] = SysRandom.randomArr();
2122
SysOut.printArray(arr);
22-
int[] tmp = CompareUtils.copyArray(arr);
2323
bubbleSort(arr);
2424
SysOut.printArray(arr);
2525
if (!CompareUtils.isSortAsc(arr)) {
26-
System.out.println("!!!有问题");
27-
SysOut.printArray(tmp);
26+
SysOut.println("。。。有问题❗️❗️❗️");
27+
Assert.assertTrue(false);
2828
}
2929

3030
SystemUtil.printLiteCuttingLine();

src/main/java/algorithm_practice/algorithmzuo/a_新手班/class01/Code05_InsertionSort.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import common.util.SysOut;
66
import common.util.SysRandom;
77
import common.util.SystemUtil;
8+
import org.junit.Assert;
89
import org.junit.Test;
910

1011
import static common.util.SwapUtil.swap;
@@ -19,13 +20,12 @@ public void testCase() {
1920
for (int i = 0; i < CommonConstants.TEST_CASE_COUNT; i++) {
2021
int arr[] = SysRandom.randomArr();
2122
SysOut.printArray(arr);
22-
int[] tmp = CompareUtils.copyArray(arr);
2323

2424
insertSort(arr);
2525
SysOut.printArray(arr);
2626
if (!CompareUtils.isSortAsc(arr)) {
27-
System.out.println("!!!有问题");
28-
SysOut.printArray(tmp);
27+
SysOut.println("。。。有问题❗️❗️❗️");
28+
Assert.assertTrue(false);
2929
}
3030

3131
SystemUtil.printLiteCuttingLine();

src/main/java/algorithm_practice/algorithmzuo/b_体系学习班/class03/Code01_1_ReverseListNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
public class Code01_1_ReverseListNode {
2020

2121
@Test
22-
public void loolTestCase() {
22+
public void loopTestCase() {
2323
for (int i = 0; i < CommonConstants.TEST_CASE_COUNT_1000; i++) {
2424
testCase();
2525
}

src/main/java/algorithm_practice/algorithmzuo/b_体系学习班/class03/Code01_2_ReverseDoubleListNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
public class Code01_2_ReverseDoubleListNode {
2020

2121
@Test
22-
public void loolTestCase() {
22+
public void loopTestCase() {
2323
for (int i = 0; i < CommonConstants.TEST_CASE_COUNT; i++) {
2424
testCase();
2525
}

src/main/java/algorithm_practice/algorithmzuo/b_体系学习班/class03/Code02_DeleteGivenValue.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
public class Code02_DeleteGivenValue {
1414

1515
@Test
16-
public void loolTestCase() {
16+
public void loopTestCase() {
1717
for (int i = 0; i < CommonConstants.TEST_CASE_COUNT_1000; i++) {
1818
testCase();
1919
}
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package algorithm_practice.algorithmzuo.b_体系学习班.class04;
2+
3+
import common.CommonConstants;
4+
import common.util.CompareUtils;
5+
import common.util.SysOut;
6+
import common.util.SysRandom;
7+
import common.util.SystemUtil;
8+
import org.junit.Assert;
9+
import org.junit.Test;
10+
11+
/**
12+
* Created by nibnait on 2022/07/07
13+
*/
14+
public class Code01_MergeSort {
15+
16+
@Test
17+
public void testCase() {
18+
for (int i = 0; i < CommonConstants.TEST_CASE_COUNT_1000; i++) {
19+
int arr[] = SysRandom.randomNaturalNumArr();
20+
// int arr[] = SysRandom.randomArr();
21+
SysOut.printArray(arr);
22+
// recursiveMergeSort(arr);
23+
mergeSort(arr);
24+
SysOut.printArray(arr);
25+
if (!CompareUtils.isSortAsc(arr)) {
26+
SysOut.println("。。。有问题❗️❗️❗️");
27+
Assert.assertTrue(false);
28+
}
29+
30+
SystemUtil.printLiteCuttingLine();
31+
}
32+
}
33+
34+
/**
35+
* 归并排序 非递归
36+
*/
37+
private void mergeSort(int[] arr) {
38+
if (arr == null || arr.length < 2) {
39+
return;
40+
}
41+
42+
int mergeSize = 1;
43+
int length = arr.length;
44+
while (mergeSize < length) {
45+
46+
// 按照步长,开始 merge
47+
int left = 0;
48+
while (left < length) {
49+
if (length - left < mergeSize) {
50+
// 此时已经不存在右边了。不需要再merge了
51+
break;
52+
}
53+
54+
int mid = left + mergeSize - 1;
55+
int right = mid + Math.min(mergeSize, length - mid - 1);
56+
57+
merge(arr, left, mid, right);
58+
left = right + 1;
59+
}
60+
61+
// 防止 mergeSize * 2 之后,导致 Integer 溢出
62+
if (mergeSize > length / 2) {
63+
break;
64+
}
65+
mergeSize <<= 1;
66+
}
67+
68+
}
69+
70+
/**
71+
* 归并排序 递归版
72+
*/
73+
private void recursiveMergeSort(int[] arr) {
74+
if (arr == null || arr.length < 2) {
75+
return;
76+
}
77+
78+
process(arr, 0, arr.length - 1);
79+
}
80+
81+
private void process(int[] arr, int left, int right) {
82+
if (left == right) {
83+
return;
84+
}
85+
86+
int mid = (left + right) / 2;
87+
process(arr, left, mid);
88+
process(arr, mid + 1, right);
89+
merge(arr, left, mid, right);
90+
}
91+
92+
private void merge(int[] arr, int left, int mid, int right) {
93+
int p1 = left;
94+
int p2 = mid + 1;
95+
96+
int[] help = new int[arr.length];
97+
for (int i = left; i <= right; i++) {
98+
help[i] = arr[i];
99+
}
100+
101+
int index = left;
102+
while (p1 <= mid && p2 <= right) {
103+
arr[index++] = help[p1] < help[p2] ? help[p1++] : help[p2++];
104+
}
105+
106+
while (p1 <= mid) {
107+
arr[index++] = help[p1++];
108+
}
109+
110+
while (p2 <= right) {
111+
arr[index++] = help[p2++];
112+
}
113+
}
114+
115+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package algorithm_practice.algorithmzuo.b_体系学习班.class04;
2+
3+
import common.CommonConstants;
4+
import common.util.SysOut;
5+
import org.junit.Test;
6+
7+
/**
8+
* Created by nibnait on 2022/07/18
9+
*/
10+
public class Code02_SmallSum {
11+
12+
@Test
13+
public void loopTestCase() {
14+
for (int i = 0; i < CommonConstants.TEST_CASE_COUNT_1000; i++) {
15+
testCase();
16+
}
17+
}
18+
19+
@Test
20+
public void testCase() {
21+
int arr[] = new int[]{1,3,4,2,5};
22+
int smallSum = mergeSort(arr);
23+
SysOut.println(smallSum);
24+
SysOut.printArray(arr);
25+
}
26+
27+
private int mergeSort(int[] arr) {
28+
if (arr == null || arr.length < 2) {
29+
return 0;
30+
}
31+
32+
return process(arr, 0, arr.length - 1);
33+
}
34+
35+
private int process(int[] arr, int left, int right) {
36+
if (left == right) {
37+
return 0;
38+
}
39+
40+
41+
int mid = (left + right) / 2;
42+
return process(arr, left, mid)
43+
+ process(arr, mid + 1, right)
44+
+ merge(arr, left, mid, right);
45+
}
46+
47+
private int merge(int[] arr, int left, int mid, int right) {
48+
int[] help = new int[arr.length];
49+
for (int i = left; i <= right; i++) {
50+
help[i] = arr[i];
51+
}
52+
53+
int p1 = left;
54+
int p2 = mid + 1;
55+
int index = left;
56+
int smallSum = 0;
57+
while (p1 <= mid && p2 <= right) {
58+
if (help[p1] < help[p2]) {
59+
smallSum += (right - p2 + 1) * arr[p1];
60+
arr[index++] = help[p1++];
61+
} else {
62+
arr[index++] = help[p2++];
63+
}
64+
}
65+
66+
while (p1 <= mid) {
67+
arr[index++] = help[p1++];
68+
}
69+
70+
while (p2 <= right) {
71+
arr[index++] = help[p2++];
72+
}
73+
74+
return smallSum;
75+
}
76+
77+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package algorithm_practice.algorithmzuo.b_体系学习班.class04;
2+
3+
import common.CommonConstants;
4+
import common.util.SysOut;
5+
import org.junit.Test;
6+
7+
/**
8+
* Created by nibnait on 2022/07/21
9+
*/
10+
public class Code03_ReversePair {
11+
12+
@Test
13+
public void loopTestCase() {
14+
for (int i = 0; i < CommonConstants.TEST_CASE_COUNT_1000; i++) {
15+
testCase();
16+
}
17+
}
18+
19+
@Test
20+
public void testCase() {
21+
int arr[] = new int[]{1,3,4,2,5};
22+
int smallSum = mergeSort(arr);
23+
SysOut.println(smallSum);
24+
SysOut.printArray(arr);
25+
}
26+
27+
private int mergeSort(int[] arr) {
28+
29+
30+
31+
return 0;
32+
}
33+
34+
35+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package algorithm_practice.algorithmzuo.b_体系学习班.class04;
2+
3+
import common.CommonConstants;
4+
import common.util.SysOut;
5+
import org.junit.Test;
6+
7+
/**
8+
* Created by nibnait on 2022/07/21
9+
*/
10+
public class Code04_BiggerThanRightTwice {
11+
12+
@Test
13+
public void loopTestCase() {
14+
for (int i = 0; i < CommonConstants.TEST_CASE_COUNT_1000; i++) {
15+
testCase();
16+
}
17+
}
18+
19+
@Test
20+
public void testCase() {
21+
int arr[] = new int[]{1,3,4,2,5};
22+
int smallSum = mergeSort(arr);
23+
SysOut.println(smallSum);
24+
SysOut.printArray(arr);
25+
}
26+
27+
private int mergeSort(int[] arr) {
28+
return 0;
29+
}
30+
31+
32+
}

0 commit comments

Comments
 (0)