diff options
Diffstat (limited to 'src/03/sort.c')
| -rw-r--r-- | src/03/sort.c | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/src/03/sort.c b/src/03/sort.c index 497d2ab..3391513 100644 --- a/src/03/sort.c +++ b/src/03/sort.c @@ -1,31 +1,34 @@ #include <stdio.h> -void _merge(int *items, int min, int pivot, int max) +void _merge(int *items, int min, int mid, int max) { - if (items[min] > items[pivot]) { - int length = (max-min) + 1; - int tmp[length]; - - for (int i = pivot; i <= max; i++) - tmp[i - pivot] = items[i]; - - for (int i = min; i < pivot; i++) - tmp[i + pivot - min] = items[i]; - - for (int i = 0; i < length; i++) - items[min+i] = tmp[i]; + int length = (max-min) + 1; + int tmp[length]; + + int j = 0, k = 0; + for (int i = 0; i < length; i++) { + if (items[min+j] < items[mid+k]) { + tmp[i] = items[min+j]; + j++; + } else { + tmp[i] = items[mid+k]; + k++; + } } + + for (int i = 0; i < length; i++) + items[min+i] = tmp[i]; } void _merge_sort(int *items, int min, int max) { - if (!items || max == min) + if (min >= max) return; - int pivot = (min + max) / 2; - _merge_sort(items, min, pivot); - _merge_sort(items, pivot + 1, max); - _merge(items, min, pivot + 1, max); + int mid = min + (max - min) / 2; + _merge_sort(items, min, mid); + _merge_sort(items, mid + 1, max); + _merge(items, min, mid + 1, max); } void merge_sort(int *items, int length) { |
