diff --git a/aim-sort/Makefile b/aim-sort/Makefile index 8bc9d49c2d8f95ad0484ef17ebff2252736e8ce0..4f3c6ce421d0c606d2024d678055fe8a05fa5413 100644 --- a/aim-sort/Makefile +++ b/aim-sort/Makefile @@ -17,7 +17,7 @@ ITERS=20 all: aim-opt aim-dbg -random: random.c +seq-gen: seq-gen.c $(CC) $(OPTCFLAGS) -o $@ $^ $(LDFLAGS) aim-opt: aim-run.c exercise.c diff --git a/aim-sort/seq-gen.c b/aim-sort/seq-gen.c new file mode 100644 index 0000000000000000000000000000000000000000..4b87080535210761e17f82bd7162e30549ac6384 --- /dev/null +++ b/aim-sort/seq-gen.c @@ -0,0 +1,63 @@ +#include <stdio.h> +#include <assert.h> +#include <stdlib.h> +#include <string.h> + +#define swap(a,b) do { __typeof(a) t = a; a = b; b = t; } while (0); +void qs(int *seq, int l, int r){ + if(l < r){ + int p = l; + for(int i = l + 1; i < r; i++){ + if(seq[i] < seq[l]){ + p++; + swap(seq[i], seq[p]); + } + } + swap(seq[l], seq[p]); + qs(seq, l, p); + qs(seq, p + 1, r); + } +} + +int main(int argc, char **argv) { + if (argc < 3 || argc > 4) { fprintf(stderr, "Usage: [random|sorted|reverse] %s count repeat\n", argv[0]); exit(1); } + int count = atoi(argv[2]); + int repeat = 1; + char *type = argv[1]; + if (argc == 4) repeat = atoi(argv[3]); + + if (count <= 0) { + fprintf(stderr, "Invalid count given: %i\n", count); + exit(2); + } + + if (repeat < 1) { + fprintf(stderr, "Invalid repeat given: %i\n", repeat); + exit(2); + } + + int *data = malloc(sizeof(int)*count); + + fprintf(stderr, "Generating %i %s sequences, each of size %i\n", repeat, type, count); + + for (int i = 0; i < count; i++) { + data[i] = rand(); + } + + if ((!strcmp(type,"sorted"))||(!strcmp(type,"reverse"))) { + qs(data, 0, count); + if (!strcmp(type, "reverse")) { + for (int i = 0; i < count/2; i++) { + swap(data[i],data[count-i-1]); + } + } + } + + /* First, generate a random sequence */ + printf("%i\n", count*repeat); + for (int r = 0; r < repeat; r++) { + for (int i = 0; i < count; i++) { + printf("%i\n", data[i]); + } + } +}