Last active
April 14, 2018 08:04
-
-
Save NaniteFactory/aab74753fd4511f7893587cdff10380a to your computer and use it in GitHub Desktop.
an implementation of next_permutation() written in java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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