summaryrefslogtreecommitdiff
path: root/src/03/sort.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/03/sort.c')
-rw-r--r--src/03/sort.c39
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) {