From b2074c035182e2eb8275c1f447354a3afb46cf45 Mon Sep 17 00:00:00 2001 From: ergz Date: Fri, 7 Jul 2023 21:24:18 -0700 Subject: [PATCH] redo qs to make sure I get it --- c/qs2.cpp | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 c/qs2.cpp diff --git a/c/qs2.cpp b/c/qs2.cpp new file mode 100644 index 0000000..816233b --- /dev/null +++ b/c/qs2.cpp @@ -0,0 +1,69 @@ +#include + +/* a rewrite to make sure I can do this without reading */ + +/* +partition + +Modifies array by moving all values less then a pivot point +to the left of it and all value greater to the right. Returns +the index of the pivot at the end of the process. + +@param int arr[] array to partition +@param int lo low value to start iteration on +@param int hi high value to end iteration on + */ +int partition(int arr[], int lo, int hi) { + int pindex = lo - 1; // where pivot will end up + int pivot_value = arr[hi]; // can be different + + for (int i = lo; i < hi; i++) { + if (arr[i] <= pivot_value) { + pindex++; + int temp = arr[i]; + arr[i] = arr[pindex]; + arr[pindex] = temp; + } + } + + // after iterating through array, we place pivot in correct + // position + pindex++; + arr[hi] = arr[pindex]; + arr[pindex] = pivot_value; + + return (pindex); +} + +/* +quick_sort + +@param int arr[] array to be sorted +@param int lo starting point for iteration +@param int hi ending point for itereation + */ +void quick_sort(int arr[], int lo, int hi) { + if (lo < hi) { // base case is lo == hi + int pivot_index = partition(arr, lo, hi); + + quick_sort(arr, lo, pivot_index - 1); + quick_sort(arr, pivot_index + 1, hi); + } +} + +void print_array(int arr[], int len) { + printf("[ "); + for (int i = 0; i < len; i++) { + printf("%d ", arr[i]); + } + printf("]\n"); +} + +int main() { + int arr[5] = {5, 4, 3, 2, 1}; + printf("before "); + print_array(arr, 5); + quick_sort(arr, 0, 4); + printf("after "); + print_array(arr, 5); +} \ No newline at end of file