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.c43
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);
+}