diff --git a/mergesort.c b/mergesort.c new file mode 100644 index 0000000..d6c8cc4 --- /dev/null +++ b/mergesort.c @@ -0,0 +1,69 @@ +#include +#include + +void printarr(int* arr, int begin, int end) { + printf("%2d - %2d: ", begin, end); + for(int i = begin; i < end; i++) { + printf("%d, ", arr[i]); + } + printf("%d\n",arr[end]); +} + +void mergesort(int* data, int begin, int end) { + if(begin==end) return; + int mid = (begin+end)/2; + + mergesort(data,begin,mid); + mergesort(data,mid+1,end); + + int iter1 = begin; + int iter2 = mid+1; + int tmp; + + int * const merge = malloc((end-begin+1) * sizeof(int)); + + int merge_i = 0; + + while(iter1 <= mid && iter2 <= end) { + if(data[iter1] > data[iter2]) { + merge[merge_i] = data[iter2]; + merge_i++; + iter2++; + } else { + merge[merge_i] = data[iter1]; + merge_i++; + iter1++; + } + } + + while(iter1 <= mid) { + merge[merge_i] = data[iter1]; + merge_i++; + iter1++; + } + + while(iter2 <= end) { + merge[merge_i] = data[iter2]; + merge_i++; + iter2++; + } + + for(int i = begin; i <= end; i++) { + data[i] = merge[i-begin]; + } + + free(merge); +} + +int main( int argc, char *argv[] ) { + + int a[10] = {5,0,2,4,9,1,3,8,6,7}; + + mergesort(a, 0, 9); + + for(int i = 0; i < 10; i++) { + printf("%d, ", a[i]); + } + printf("\n"); + return 0; +}