4 /* Block Sorting Optimizado en memoria! */
6 typedef struct _bs_decode_t_ {
11 char es_menor(char *data, t_BlockSort *bs, int i, int j);
13 int _compare(const void *d1, const void *d2) {
14 t_BlockSortDecode *s1, *s2;
16 s1 = (t_BlockSortDecode *)d1;
17 s2 = (t_BlockSortDecode *)d2;
19 return (s1->c - s2->c);
22 int __compare(const void *d1, const void *d2) {
23 t_BlockSortData *s1, *s2;
25 s1 = (t_BlockSortData *)d1;
26 s2 = (t_BlockSortData *)d2;
28 return es_menor(s1->bs->data, s1->bs, s1->pos_inicial, s2->pos_inicial);
31 char es_menor(char *data, t_BlockSort *bs, int i, int j)
33 unsigned long int pi, pj, k;
35 for(k=0; k<bs->len; k++) {
39 if (data[pi] > data[pj]) return 1; /* El primero es mayor */
40 if (data[pi] < data[pj]) return -1; /* El primero es menor */
47 void generar_array(char *data, t_BlockSort *bs)
50 for(i=0; i<bs->len; i++) {
51 bs->array[i].pos_inicial = i;
52 bs->array[i].pos_final = (i+bs->len-1)%bs->len;
53 bs->array[i].ord = (i==0)?1:0;
58 void ordenar_array(char *data, t_BlockSort *bs)
60 qsort(bs->array, bs->len, sizeof(t_BlockSortData), __compare);
63 void print_(char *data, unsigned long int pos, unsigned long int len)
68 printf("%c", data[(pos+i)%len]);
72 int generar_salida(char *data, t_BlockSort *bs, char *salida)
74 unsigned long int i, k;
76 for(i=0; i<bs->len; i++) {
77 /* print_(data, bs->array[i].pos_inicial, bs->len); */
78 salida[i] = data[bs->array[i].pos_final];
79 if (bs->array[i].ord == 1) k = i;
84 void bs_solve(char *in, char *out, t_BlockSort *bs, unsigned long int *k, unsigned int leido)
88 /* Hack para pedasos menores a la pagina */
89 if (leido < bs->len) bs->len = leido;
92 generar_array(in, bs);
93 ordenar_array(in, bs);
94 (*k) = generar_salida(in, bs, out);
99 void bs_restore(char *dst, char *c, unsigned long int k, unsigned long int len)
101 unsigned long int i, current;
102 t_BlockSortDecode *in;
104 in = malloc(sizeof(t_BlockSortDecode)*len);
106 for(i=0; i<len; i++) {
111 qsort(in, len, sizeof(t_BlockSortDecode), _compare);
116 dst[i++] = in[current].c;
117 current = in[current].pos;
118 } while (current != k);
122 t_BlockSort *bs_create(unsigned long int len)
126 tmp = malloc(sizeof(t_BlockSort));
127 tmp->array = malloc(sizeof(t_BlockSortData)*len);
134 void bs_destroy(t_BlockSort *bs)