Mergesort
This commit is contained in:
parent
70f777aae4
commit
0956cae266
1 changed files with 69 additions and 0 deletions
69
mergesort.c
Normal file
69
mergesort.c
Normal file
|
@ -0,0 +1,69 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
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;
|
||||
}
|
Loading…
Reference in a new issue