From 8a521dd2782e91ebf9598fdec88950f3f95f3bb7 Mon Sep 17 00:00:00 2001 From: Valentin Gehrke Date: Mon, 15 Feb 2016 17:25:46 +0100 Subject: [PATCH] EPA: Bitonic sort --- bitonic.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 bitonic.c diff --git a/bitonic.c b/bitonic.c new file mode 100644 index 0000000..c9bdf99 --- /dev/null +++ b/bitonic.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include + +#define TESTSIZE ((size_t)( 1<<25 )) + +void comp_and_swap(int* data, size_t i, size_t j) { + if(data[i] > data[j]) { + int tmp = data[i]; + data[i] = data[j]; + data[j] = tmp; + } +} + +void sort_step(int* data, size_t N, size_t shift, unsigned int step) { + for(size_t i = 0; i < N; i+=2*shift) { + for(size_t j = i; j < i+shift; j++) { + if( (i/step)%2 == 0 ) { + comp_and_swap(data, j, j+shift); + } else { + comp_and_swap(data, j+shift, j); + } + } + } +} + +void sort_step2(int* data, size_t N, size_t step) { + for(size_t i = step; i > 1; i/=2) { + sort_step(data, N, i/2, step); + } +} + +void bitonic_sort(int* data, size_t N) { + for(size_t step = 2; step <= N; step*=2) { + printf("Pack: %d\n", step); + sort_step2(data, N, step); + } +} + +int main( int argc, char *argv[] ) { + srand(time(NULL)); + + int* data = malloc(sizeof(int) * TESTSIZE); + for(size_t i = 0; i < TESTSIZE; i++) { + data[i] = rand() % 1000; + } + + bitonic_sort(data, TESTSIZE); + + for(size_t i = 0; i < TESTSIZE-1; i++) { + assert(data[i] <= data[i+1]); + } + + return 0; +}