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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
| import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import static org.junit.jupiter.api.Assertions.*;
import java.util.Arrays;
import java.util.Random;
/**
* MergeSort 單元測試
*/
class MergeSortTest {
@Test
@DisplayName("測試空數組")
void testEmptyArray() {
int[] array = {};
ClassicMergeSort.mergeSort(array);
assertEquals(0, array.length);
}
@Test
@DisplayName("測試單元素數組")
void testSingleElement() {
int[] array = {42};
ClassicMergeSort.mergeSort(array);
assertArrayEquals(new int[]{42}, array);
}
@Test
@DisplayName("測試已排序數組")
void testAlreadySorted() {
int[] array = {1, 2, 3, 4, 5};
int[] expected = array.clone();
ClassicMergeSort.mergeSort(array);
assertArrayEquals(expected, array);
}
@Test
@DisplayName("測試逆序數組")
void testReverseSorted() {
int[] array = {5, 4, 3, 2, 1};
int[] expected = {1, 2, 3, 4, 5};
ClassicMergeSort.mergeSort(array);
assertArrayEquals(expected, array);
}
@Test
@DisplayName("測試重複元素")
void testDuplicateElements() {
int[] array = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
int[] expected = {1, 1, 2, 3, 3, 4, 5, 5, 6, 9};
ClassicMergeSort.mergeSort(array);
assertArrayEquals(expected, array);
}
@ParameterizedTest
@ValueSource(ints = {10, 100, 1000, 10000})
@DisplayName("測試不同大小的隨機數組")
void testRandomArrays(int size) {
int[] array = generateRandomArray(size);
int[] expected = array.clone();
Arrays.sort(expected); // 使用 Java 內置排序作為標準
ClassicMergeSort.mergeSort(array);
assertArrayEquals(expected, array);
}
@Test
@DisplayName("測試穩定性")
void testStability() {
// 使用自定義對象測試穩定性
class StableTestObject {
final int value;
final int order;
StableTestObject(int value, int order) {
this.value = value;
this.order = order;
}
}
StableTestObject[] array = {
new StableTestObject(3, 1),
new StableTestObject(1, 1),
new StableTestObject(3, 2),
new StableTestObject(2, 1),
new StableTestObject(3, 3)
};
ModernMergeSort.mergeSort(array,
java.util.Comparator.comparing(obj -> obj.value));
// 驗證相同值的元素保持原始順序
assertEquals(1, array[0].value);
assertEquals(2, array[1].value);
assertEquals(3, array[2].value);
assertEquals(1, array[2].order); // 第一個 3
assertEquals(3, array[3].value);
assertEquals(2, array[3].order); // 第二個 3
assertEquals(3, array[4].value);
assertEquals(3, array[4].order); // 第三個 3
}
private int[] generateRandomArray(int size) {
Random random = new Random(System.currentTimeMillis());
int[] array = new int[size];
for (int i = 0; i < size; i++) {
array[i] = random.nextInt(size * 2);
}
return array;
}
}
|
留言討論