fcds-lab-2015/c_sequential/bucketsort/bucketsort.c

58 lines
1.2 KiB
C

#include <stdlib.h>
#include <string.h>
#include "bucketsort.h"
// Printable characters in Ascii (from 34 to 127);
// actually 127 is also not printable
#define N_BUCKETS 94
typedef struct {
long int *data;
int length;
long int total;
} bucket;
void sort(char *a, bucket *bucket) {
int j, i, length;
long int key;
length = bucket->length;
for (j = 1; j < bucket->total; j++) {
key = bucket->data[j];
i = j - 1;
while (i >= 0
&& strcmp(a + bucket->data[i] * length, a + key * length) > 0) {
bucket->data[i + 1] = bucket->data[i];
i--;
}
bucket->data[i + 1] = key;
}
}
long int* bucket_sort(char *a, int length, long int size) {
long int i;
bucket buckets[N_BUCKETS], *b;
long int *returns;
// allocate memory
returns = malloc(sizeof(long int) * size);
for (i = 0; i < N_BUCKETS; i++) {
buckets[i].data = returns + i * size / N_BUCKETS;
buckets[i].length = length;
buckets[i].total = 0;
}
// copy the keys to "buckets"
for (i = 0; i < size; i++) {
// 0x21 = 33d, number of unprintable characters in Ascii
b = &buckets[*(a + i * length) - 0x21];
b->data[b->total++] = i;
}
// sort each "bucket"
for (i = 0; i < N_BUCKETS; i++)
sort(a, &buckets[i]);
return returns;
}