I need a simple Algorithm of permutation generator which could be apply on simple C language.
A:
Permutes over numbers:
In order to do use each permutation, you have to hook up to the print function.
#include <stdio.h>
#include <stdlib.h>
/**
Read a number, N, from standard input and print the
permutations.
*/
void print(const int *v, const int size)
{
if (v != 0) {
for (int i = 0; i < size; i++) {
printf("%4d", v[i] );
}
printf("\n");
}
} // print
void swap(int *v, const int i, const int j)
{
int t;
t = v[i];
v[i] = v[j];
v[j] = t;
}
void rotateLeft(int *v, const int start, const int n)
{
int tmp = v[start];
for (int i = start; i < n-1; i++) {
v[i] = v[i+1];
}
v[n-1] = tmp;
} // rotateLeft
void permute(int *v, const int start, const int n)
{
print(v, n);
if (start < n) {
int i, j;
for (i = n-2; i >= start; i--) {
for (j = i + 1; j < n; j++) {
swap(v, i, j);
permute(v, i+1, n);
} // for j
rotateLeft(v, i, n);
} // for i
}
} // permute
void init(int *v, int N)
{
for (int i = 0; i < N; i++) {
v[i] = i+1;
}
} // init
int main()
{
int *v = (int*) malloc(sizeof(int)*10);
init(v, 10);
permute(v, 0, 10);
free(v);
}
Ronny
2010-10-05 09:06:34
This is C++ code, not C. However, it can be easily transformed to C code: `s/new int[10]/malloc(10*sizeof(int))/` and `s/delete [] v/free(v)/`
Bart van Ingen Schenau
2010-10-05 09:48:25
thanks. I wasn't paying attention.
Ronny
2010-10-05 10:14:16
A:
I have, ahem, written a little about permutations and other combinatorial algorithms in C here:
Martin Broadhurst
2010-10-13 21:10:36
A:
This is a classic algorithm found (among other places) in Knuth's TAOCP.
Here's an example I used for a project euler problem. It creates all the permutations of a string in lexicographical order and prints them to stdout.
#include<stdio.h>
int main()
{
char set[10]="0123456789";
char scratch;
int lastpermutation = 0;
int i, j, k, l;
printf("%s\n",set);
while (!lastpermutation)
{
//find largest j such that set[j] < set[j+1]; if no such j then done
j = -1;
for (i = 0; i < 10; i++)
{
if (set[i+1] > set[i])
{
j = i;
}
}
if (j == -1)
{
lastpermutation = 1;
}
if (!lastpermutation)
{
for (i = j+1; i < 10; i++)
{
if (set[i] > set[j])
{
l = i;
}
}
scratch = set[j];
set[j] = set[l];
set[l] = scratch;
//reverse j+1 to end
k = (9-j)/2; // number of pairs to swap
for (i = 0; i < k; i++)
{
scratch = set[j+1+i];
set[j+1+i] = set[9-i];
set[9-i] = scratch;
}
printf("%s\n",set);
}
}
return 0;
}
Tristan
2010-10-13 21:35:29