Skip to content

Commit bc1bd33

Browse files
committed
Add TournamentSort sorting algorithm (#6631)
1 parent 68746f8 commit bc1bd33

File tree

2 files changed

+105
-0
lines changed

2 files changed

+105
-0
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.thealgorithms.sorts;
2+
3+
import java.util.Arrays;
4+
5+
public class TournamentSort implements SortAlgorithm {
6+
7+
@Override
8+
public <T extends Comparable<T>> T[] sort(T[] array) {
9+
if (array == null || array.length <= 1) return array;
10+
T[] arr = Arrays.copyOf(array, array.length);
11+
int n = arr.length;
12+
T[] sorted = Arrays.copyOf(array, array.length);
13+
14+
for (int i = 0; i < n; i++) {
15+
int size = nextPowerOfTwo(n - i);
16+
@SuppressWarnings("unchecked")
17+
T[] tree = (T[]) new Comparable[2 * size - 1];
18+
for (int j = 0; j < n - i; j++) tree[size - 1 + j] = arr[j];
19+
for (int j = size - 2; j >= 0; j--) {
20+
T left = tree[2 * j + 1], right = tree[2 * j + 2];
21+
if (left == null) tree[j] = right;
22+
else if (right == null) tree[j] = left;
23+
else tree[j] = left.compareTo(right) <= 0 ? left : right;
24+
}
25+
sorted[i] = tree[0];
26+
removeWinner(arr, sorted[i]);
27+
}
28+
return sorted;
29+
}
30+
31+
private <T extends Comparable<T>> void removeWinner(T[] arr, T winner) {
32+
for (int i = 0; i < arr.length; i++) {
33+
if (arr[i] != null && arr[i].equals(winner)) {
34+
arr[i] = null;
35+
compact(arr);
36+
break;
37+
}
38+
}
39+
}
40+
41+
private <T> void compact(T[] arr) {
42+
int index = 0;
43+
for (T element : arr) {
44+
if (element != null) arr[index++] = element;
45+
}
46+
while (index < arr.length) arr[index++] = null;
47+
}
48+
49+
private int nextPowerOfTwo(int n) {
50+
int p = 1;
51+
while (p < n) p <<= 1;
52+
return p;
53+
}
54+
55+
public static void main(String[] args) {
56+
TournamentSort sorter = new TournamentSort();
57+
Integer[] arr = {5, 3, 8, 4, 1, 2};
58+
Integer[] res = sorter.sort(arr);
59+
System.out.println(Arrays.toString(res));
60+
}
61+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.thealgorithms.sorts;
2+
3+
import org.junit.jupiter.api.Test;
4+
import static org.junit.jupiter.api.Assertions.*;
5+
6+
public class TournamentSortTest {
7+
8+
@Test
9+
public void testBasic() {
10+
TournamentSort sorter = new TournamentSort();
11+
Integer[] arr = {5, 3, 8, 4, 1, 2};
12+
Integer[] expected = {1, 2, 3, 4, 5, 8};
13+
assertArrayEquals(expected, sorter.sort(arr));
14+
}
15+
16+
@Test
17+
public void testAlreadySorted() {
18+
TournamentSort sorter = new TournamentSort();
19+
Integer[] arr = {1, 2, 3, 4};
20+
assertArrayEquals(arr, sorter.sort(arr));
21+
}
22+
23+
@Test
24+
public void testReverseOrder() {
25+
TournamentSort sorter = new TournamentSort();
26+
Integer[] arr = {9, 7, 5, 3, 1};
27+
Integer[] expected = {1, 3, 5, 7, 9};
28+
assertArrayEquals(expected, sorter.sort(arr));
29+
}
30+
31+
@Test
32+
public void testSingleElement() {
33+
TournamentSort sorter = new TournamentSort();
34+
Integer[] arr = {42};
35+
assertArrayEquals(arr, sorter.sort(arr));
36+
}
37+
38+
@Test
39+
public void testEmptyArray() {
40+
TournamentSort sorter = new TournamentSort();
41+
Integer[] arr = {};
42+
assertArrayEquals(arr, sorter.sort(arr));
43+
}
44+
}

0 commit comments

Comments
 (0)