Skip to content

Commit e3e1c84

Browse files
Maiklinspivovarit
authored andcommitted
BAEL-2485 Permutations of an array in Java (eugenp#6027)
1 parent b1352b5 commit e3e1c84

File tree

1 file changed

+123
-0
lines changed
  • algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/permutation

1 file changed

+123
-0
lines changed
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package com.baeldung.algorithms.permutation;
2+
3+
import java.util.Arrays;
4+
import java.util.Collections;
5+
6+
public class Permutation {
7+
8+
public static <T> void printAllRecursive(T[] elements, char delimiter) {
9+
printAllRecursive(elements.length, elements, delimiter);
10+
}
11+
12+
public static <T> void printAllRecursive(int n, T[] elements, char delimiter) {
13+
14+
if(n == 1) {
15+
printArray(elements, delimiter);
16+
} else {
17+
for(int i = 0; i < n-1; i++) {
18+
printAllRecursive(n - 1, elements, delimiter);
19+
if(n % 2 == 0) {
20+
swap(elements, i, n-1);
21+
} else {
22+
swap(elements, 0, n-1);
23+
}
24+
}
25+
printAllRecursive(n - 1, elements, delimiter);
26+
}
27+
}
28+
29+
public static <T> void printAllIterative(int n, T[] elements, char delimiter) {
30+
31+
int[] indexes = new int[n];
32+
for (int i = 0; i < n; i++) {
33+
indexes[i] = 0;
34+
}
35+
36+
printArray(elements, delimiter);
37+
38+
int i = 0;
39+
while (i < n) {
40+
if (indexes[i] < i) {
41+
swap(elements, i % 2 == 0 ? 0: indexes[i], i);
42+
printArray(elements, delimiter);
43+
indexes[i]++;
44+
i = 0;
45+
}
46+
else {
47+
indexes[i] = 0;
48+
i++;
49+
}
50+
}
51+
}
52+
53+
public static <T extends Comparable<T>> void printAllOrdered(T[] elements, char delimiter) {
54+
55+
Arrays.sort(elements);
56+
boolean hasNext = true;
57+
58+
while(hasNext) {
59+
printArray(elements, delimiter);
60+
int k = 0, l = 0;
61+
hasNext = false;
62+
for (int i = elements.length - 1; i > 0; i--) {
63+
if (elements[i].compareTo(elements[i - 1]) > 0) {
64+
k = i - 1;
65+
hasNext = true;
66+
break;
67+
}
68+
}
69+
70+
for (int i = elements.length - 1; i > k; i--) {
71+
if (elements[i].compareTo(elements[k]) > 0) {
72+
l = i;
73+
break;
74+
}
75+
}
76+
77+
swap(elements, k, l);
78+
Collections.reverse(Arrays.asList(elements).subList(k + 1, elements.length));
79+
}
80+
}
81+
82+
public static <T> void printRandom(T[] elements, char delimiter) {
83+
84+
Collections.shuffle(Arrays.asList(elements));
85+
printArray(elements, delimiter);
86+
}
87+
88+
private static <T> void swap(T[] elements, int a, int b) {
89+
90+
T tmp = elements[a];
91+
elements[a] = elements[b];
92+
elements[b] = tmp;
93+
}
94+
95+
private static <T> void printArray(T[] elements, char delimiter) {
96+
97+
String delimiterSpace = delimiter + " ";
98+
for(int i = 0; i < elements.length; i++) {
99+
System.out.print(elements[i] + delimiterSpace);
100+
}
101+
System.out.print('\n');
102+
}
103+
104+
public static void main(String[] argv) {
105+
106+
Integer[] elements = {1,2,3,4};
107+
108+
System.out.println("Rec:");
109+
printAllRecursive(elements, ';');
110+
111+
System.out.println("Iter:");
112+
printAllIterative(elements.length, elements, ';');
113+
114+
System.out.println("Orderes:");
115+
printAllOrdered(elements, ';');
116+
117+
System.out.println("Random:");
118+
printRandom(elements, ';');
119+
120+
System.out.println("Random:");
121+
printRandom(elements, ';');
122+
}
123+
}

0 commit comments

Comments
 (0)