Skip to content

Instantly share code, notes, and snippets.

@bostelk
Last active July 30, 2019 11:39
Show Gist options
  • Save bostelk/46e2ed35e1c0c59a688eba21c9dbdf2c to your computer and use it in GitHub Desktop.
Save bostelk/46e2ed35e1c0c59a688eba21c9dbdf2c to your computer and use it in GitHub Desktop.
permutations in lexicographic order
#include <stdio.h>
#include <stdlib.h>
int numbers[4] = { 1, 2, 3, 4};
int asc (const void * a, const void * b)
{
if ( *(int*)a < *(int*)b ) return -1;
if ( *(int*)a == *(int*)b ) return 0;
if ( *(int*)a > *(int*)b ) return 1;
}
bool next_permutation(int* numbers, int length)
{
const int invalid = -1;
int k = invalid;
int l = invalid;
for(int i = 0; i < length-1; ++i)
{
if (numbers[i] < numbers[i+1] && i > k)
{
k = i;
}
}
for(int i = 0; i < length; ++i)
{
if (numbers[k] < numbers[i] && i > l)
{
l = i;
}
}
if (k != invalid && l != invalid)
{
int tmp = numbers[l];
numbers[l] = numbers[k];
numbers[k] = tmp;
}
int s = k + 1;
int e = length;
int d = e - s;
for(int i = 0; i < d/2; ++i)
{
int tmp = numbers[s + i];
numbers[s + i] = numbers[e - i - 1];
numbers[e - i - 1] = tmp;
}
return k != invalid;
}
int main() {
qsort (numbers, 4, sizeof(int), asc);
printf("%d %d %d %d\n", numbers[0], numbers[1], numbers[2], numbers[3]);
while(next_permutation(numbers, 4))
{
printf("%d %d %d %d\n", numbers[0], numbers[1], numbers[2], numbers[3]);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment