Skip to content

Instantly share code, notes, and snippets.

@NaniteFactory
Last active April 14, 2018 08:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save NaniteFactory/aab74753fd4511f7893587cdff10380a to your computer and use it in GitHub Desktop.
Save NaniteFactory/aab74753fd4511f7893587cdff10380a to your computer and use it in GitHub Desktop.
an implementation of next_permutation() written in java
public class NextPermutation {
public static void swap(int[] arr, int index1, int index2) {
int tmp = arr[index2];
arr[index2] = arr[index1];
arr[index1] = tmp;
}
public static boolean nextPermutation(int[] arr) {
final int indexLast = arr.length - 1;
// 1. Finding pivot
int indexPivot = -1;
for (int i = indexLast; i >= 1; --i) {
if (arr[i-1] < arr[i]) {
indexPivot = i - 1;
break;
}
}
if (indexPivot == -1) return false; // last perm
// 2. Finding the one to be swapped + Swap
int indexToBeSwapped = -1;
for (int i = indexLast; i > indexPivot; --i) {
if (arr[indexPivot] < arr[i]) {
indexToBeSwapped = i;
break;
}
}
swap(arr, indexPivot, indexToBeSwapped);
// 3. Reversing sequence of the rest
final int nSwaps = (int)Math.floor((indexLast - indexPivot) / 2);
int indexLeft = indexPivot + 1;
int indexRight = indexLast;
for (int i = 0; i < nSwaps; ++i, ++indexLeft, --indexRight) {
swap(arr, indexLeft, indexRight);
}
return true;
}
public static void printArr(int[] arr) {
StringBuilder sb = new StringBuilder();
for (int e : arr) {
sb.append(e);
sb.append(' ');
}
System.out.println(sb);
}
public static void main(String[] args) {
int[] arr = new int[5];
for (int i = 0; i < 5; ++i) arr[i] = i;
do {
printArr(arr);
} while (nextPermutation(arr));
}
} // public class
public class PrevPermutation {
public static void swap(int[] arr, int index1, int index2) {
int tmp = arr[index2];
arr[index2] = arr[index1];
arr[index1] = tmp;
}
public static void swap(int[] arr, int i1, int i2) {
int tmp = arr[i1];
arr[i1] = arr[i2];
arr[i2] = tmp;
}
public static boolean nextPermutation(int[] arr) {
int indexPivot = -1;
for (int i = arr.length - 1; i >= 1; --i ) {
if (arr[i-1] < arr[i]) { // <---------------------------------------------------
indexPivot = i - 1;
break;
}
}
if (indexPivot == -1) return false;
// 2. 피벗과 한 놈 바꾸기
int indexToSwap = -1;
for (int i = arr.length - 1; i > indexPivot; --i ) {
if (arr[indexPivot] < arr[i]) { // <---------------------------------------------------
indexToSwap = i;
break;
}
}
swap(arr, indexPivot, indexToSwap);
// 3. 나머지 역순
for (int i = 0; i < Math.floor((arr.length - 1 - indexPivot) / 2); ++i) {
swap(arr, indexPivot + 1 + i, arr.length - 1 - i);
}
return true;
} // func
public static boolean prevPermutation(int[] arr) {
int indexPivot = -1;
for (int i = arr.length - 1; i >= 1; --i ) {
if (arr[i-1] > arr[i]) { // <---------------------------------------------------
indexPivot = i - 1;
break;
}
}
if (indexPivot == -1) return false;
// 2. 피벗과 한 놈 바꾸기
int indexToSwap = -1;
for (int i = arr.length - 1; i > indexPivot; --i ) {
if (arr[indexPivot] > arr[i]) { // <---------------------------------------------------
indexToSwap = i;
break;
}
}
swap(arr, indexPivot, indexToSwap);
// 3. 나머지 역순
for (int i = 0; i < Math.floor((arr.length - 1 - indexPivot) / 2); ++i) {
swap(arr, indexPivot + 1 + i, arr.length - 1 - i);
}
return true;
} // func
public static void printArr(int[] arr) {
StringBuilder sb = new StringBuilder();
for (int e : arr) {
sb.append(e);
sb.append(' ');
}
System.out.println(sb);
}
public static void main(String[] args) {
int[] arr = new int[5];
for (int i = 0; i < 5; ++i) arr[i] = i;
do {
printArr(arr);
} while (nextPermutation(arr));
do {
printArr(arr);
} while (prevPermutation(arr));
}
} // public class
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment