diff --git a/heapsort2.c b/heapsort2.c new file mode 100644 index 0000000..f97ecef --- /dev/null +++ b/heapsort2.c @@ -0,0 +1,49 @@ +#include + +void swap(int* data, unsigned int i, unsigned int j) { + int tmp = data[i]; + data[i] = data[j]; + data[j] = tmp; +} + +void siftdown(int* data, unsigned int n, unsigned int i) { + unsigned int left, right, ip; + while( i < n ) { + left = 2 * i + 1; + right = 2 * i + 2; + if( !(left < n) ) break; + + ip = left; + + if( right < n && data[ip] < data[right] ) ip = right; + if( data[ip] < data[i] ) break; + + swap(data,i,ip); + i = ip; + } +} + +void heapcreate(int* data, unsigned int n) { + for(unsigned int i = n/2; i > 0; i--) { + siftdown(data, n, i); + } + siftdown(data, n, 0); +} + +void heapsort(int* data, unsigned int n) { + heapcreate(data, n); + for(unsigned int heapsize = n-1; heapsize > 0; heapsize--) { + swap(data,0,heapsize); + siftdown(data,heapsize,0); + } +} + +int main( int argc, char *argv[] ) { + int data[10] = { 3,7,5,1,2,8,9,0,4,6 }; + heapsort(data, 10); + + for(unsigned int i = 0; i < 10; i++) printf("%d ", data[i]); + printf("\n"); + + return 0; +}