#include <stdio.h>
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
void reverse(int arr[], int start, int end) {
while (start < end) {
swap(&arr[start], &arr[end]);
start++;
end--;
}
}
void nextPermutation(int arr[], int n) {
int i = n - 2;
// Find pivot
while (i >= 0 && arr[i] >= arr[i + 1]) {
i--;
}
if (i >= 0) {
int j = n - 1;
// Find successor
while (arr[j] <= arr[i]) {
j--;
}
swap(&arr[i], &arr[j]);
}
// Reverse suffix
reverse(arr, i + 1, n - 1);
}
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d", arr[i]);
if (i != n - 1) printf(" -> ");
}
printf(" -> null\n");
}
int main() {
int arr[] = {1, 2, 3};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Original array:\n");
printArray(arr, n);
nextPermutation(arr, n);
printf("Next permutation:\n");
printArray(arr, n);
return 0;
}while (i >= 0 && arr[i] >= arr[i + 1]) { i--; }
Find pivot index where ascending order breaks from right
while (arr[j] <= arr[i]) { j--; }
Find successor index to pivot that is just bigger
Swap pivot and successor to increase permutation
reverse(arr, i + 1, n - 1);
Reverse suffix to get smallest order after pivot
Original array:
1 -> 2 -> 3 -> null
Next permutation:
1 -> 3 -> 2 -> null