squiggle.c

Self-contained Monte Carlo estimation in C99
Log | Files | Refs | README

commit 578bfa27987bfeb7ca57f2d98fb807005145d206
parent 4a24a6b93500e4b8f18f9bfd63124602dcfe2c0b
Author: NunoSempere <nuno.sempere@protonmail.com>
Date:   Wed, 29 Nov 2023 21:34:39 +0000

implement quickselect function

Diffstat:
Mscratchpad/quickselect/quickselect | 0
Mscratchpad/quickselect/quickselect.c | 78+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 77 insertions(+), 1 deletion(-)

diff --git a/scratchpad/quickselect/quickselect b/scratchpad/quickselect/quickselect Binary files differ. diff --git a/scratchpad/quickselect/quickselect.c b/scratchpad/quickselect/quickselect.c @@ -2,7 +2,83 @@ #include <stdio.h> #include <stdlib.h> +void swap_pointers(double *x, double* y){ + double tmp = *x; + *x = *y; + *y = tmp; +} + +void swap_in_array(int i, int j, double xs[]){ + double tmp = xs[i]; + xs[i] = xs[j]; + xs[j] = tmp; +} + +void array_print(double xs[], int n){ + printf(" ["); + for(int i=0; i<n;i++){ + printf("%f, ", xs[i]); + } + printf("]\n"); +} + +int partition(int low, int high, double xs[], int length){ + // srand(2); + array_print(xs, length); + int pivot = low + floor((high-low)/2); // low + floor(rand() % (high - low + 1)); + double pivot_value = xs[pivot]; + printf("pivot_value: #%f\n", pivot_value); + swap_in_array(pivot, high, xs); + int gt = low; /* This pointer will iterate until finding an element which is greater than the pivot. Then it will move elements that are smaller before it--more specifically, it will move elements to its position and then increment. As a result all elements between gt and i will be greater than the pivot. */ + for(int i=low; i<high; i++){ + printf("Step: #%d\n", i); + printf(" Before: \n"); + printf(" gt: %d\n", gt); + array_print(xs, length); + if(xs[i] < pivot_value){ + printf(" Swaping element #%d: %f and element #%d: %f\n", gt, xs[gt], i, xs[i]); + swap_in_array(gt, i, xs); + gt++; + } + printf(" After: \n"); + array_print(xs, length); + printf(" gt: %d\n", gt); + } + printf("Step: Swap with last item\n"); + swap_in_array(high, gt, xs); + printf(" After: \n"); + array_print(xs, length); + printf(" gt: %d\n", gt); + return gt; +} + +double quickselect(int k, double xs[], int length){ + int low = 0; + int high = length - 1; + for (;;){ + if(low == high){ + return xs[low]; + } + int pivot = partition(low, high, xs, length); + if(pivot == k){ + return xs[pivot]; + }else if(k < pivot){ + high = pivot - 1; + } else { + low = pivot + 1; + } + } +} + int main(){ - printf("Hello world!\n"); + double xs[] = {2.1, 1.0, 6.0, 4.0, 7.0, -1.0, 2.0, 10.0}; + int length = 8; + int k = 2; + + // partition(0, length-1, xs, length); + + double result = quickselect(k, xs, length); + array_print(xs, 8); + printf("The item in pos #%d is: %f\n", k, result); return 0; }