diff options
Diffstat (limited to 'src/03/sort.c')
| -rw-r--r-- | src/03/sort.c | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/src/03/sort.c b/src/03/sort.c index e0eb9b6..c011733 100644 --- a/src/03/sort.c +++ b/src/03/sort.c @@ -1,7 +1,7 @@ #include <stdio.h> +#include <stdlib.h> -void _merge(int *items, int min, int mid, int max) -{ +void _merge(int *items, int min, int mid, int max) { int length = (max-min) + 1; int tmp[length]; int j = min, k = mid; @@ -23,8 +23,7 @@ void _merge(int *items, int min, int mid, int max) items[min+i] = tmp[i]; } -void _merge_sort(int *items, int min, int max) -{ +void _merge_sort(int *items, int min, int max) { if (min >= max) return; @@ -40,3 +39,39 @@ void merge_sort(int *items, int length) { _merge_sort(items, 0, length - 1); } + +int partition(int *items, int min, int max) { + int pivot = items[max]; + int index = min - 1; + int tmp; + + for (int j = min; j < max; j++) { + if (items[j] < pivot) { + index++; + tmp = items[index]; + items[index] = items[j]; + items[j] = tmp; + } + } + tmp = items[index+1]; + items[index+1] = items[max]; + items[max] = tmp; + + return index + 1; +} + +void _quick_sort(int *items, int min, int max) { + if (min >= max) + return; + + int index = partition(items, min, max); + _quick_sort(items, min, index - 1); + _quick_sort(items, index + 1, max); +} + +void quick_sort(int *items, int length) { + if (!items) + return; + + _quick_sort(items, 0, length - 1); +} |
