#include <stdio.h>
void shuffle( char **arr, int *offs, size_t cnt);
void shuffle( char **arr, int *offs, size_t cnt)
{
unsigned idx,src,dst;
for (idx=0; idx < cnt; idx++) offs[idx] -= idx;
for (idx=0; idx < cnt; idx++) {
if (offs[idx] == 0) continue;
char *tmp;
tmp = arr[idx];
for(dst = idx; offs[dst] ; dst=src) {
src = dst+offs[dst] ;
arr[dst] = arr[src];
offs[dst] = 0;
if (offs[src] == 0 ) break;
}
arr[dst]=tmp;
}
}
int main (void)
{
unsigned idx;
char *array[5] = {"D","A","B","E","C"};
int index[5] = {1,2,4,0,3};
fprintf(stdout, "Original:\n");
for (idx=0; idx < 5; idx++) {
fprintf(stdout, "[%u]:%s\n", idx, array[idx] );
}
fprintf(stdout, "Shuffle:\n");
shuffle( array, index, 5);
fprintf(stdout, "After shuffle:\n");
for (idx=0; idx < 5; idx++) {
fprintf(stdout, "[%u]:%s\n", idx, array[idx] );
}
return 0;
}
Update: fixed end of chain condition (ugly!)