From 621e895b19d908f835f9627d441b8197c203e9be Mon Sep 17 00:00:00 2001 From: Valentin Gehrke Date: Thu, 11 Feb 2016 15:04:21 +0100 Subject: [PATCH] EPA: Heapsort --- heapsort.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 heapsort.c diff --git a/heapsort.c b/heapsort.c new file mode 100644 index 0000000..4b88d83 --- /dev/null +++ b/heapsort.c @@ -0,0 +1,65 @@ +#include +#include +#include +#include + +void swap(int* data, size_t i, size_t j) { + int tmp = data[i]; + data[i] = data[j]; + data[j] = tmp; +} + +void siftdown(int* data, size_t n, size_t i) { + while(2*i+1=n) { + if(data[i] < data[2*i+1]) { + swap(data, i, 2*i+1); + i = 2*i+1; + } else { + break; + } + } else { + if(data[i] < data[2*i+1] && data[2*i+1] > data[2*i+2]) { + swap(data, i, 2*i+1); + i = 2*i+1; + } else if(data[i] < data[2*i+2]) { + swap(data, i, 2*i+2); + i = 2*i+2; + } else { + break; + } + } + } +} + +void heapcreate(int* data, size_t n) { + for(int i = (n-2)/2; i >= 0; i--) { + siftdown(data, n, i); + } +} + +void heapsort(int* data, size_t n) { + heapcreate(data, n); + for(size_t i = n-1; i > 0; i--) { + swap(data, 0, i); + siftdown(data, i, 0); + } +} + +int main( int argc, char *argv[] ) { + + int n = 1000; + if(argc > 1) n = atoi(argv[1]); + srand(time(NULL)); + int* data = malloc(sizeof(int)*n); + for(size_t i = 0; i < n; i++) { + data[i] = rand(); + } + heapsort(data,n); + int prev = data[0]; + for(size_t i = 1; i < n; i++) { + assert(prev <= data[i]); + prev = data[i]; + } + return 0; +}