EPA: Bitonic sort
This commit is contained in:
parent
6e26844a6f
commit
8a521dd278
1 changed files with 56 additions and 0 deletions
56
bitonic.c
Normal file
56
bitonic.c
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
Loading…
Reference in a new issue