From 3e4360f9304bf848ef1173ba95c2cf7101d1c5df Mon Sep 17 00:00:00 2001 From: NunoSempere Date: Wed, 29 Nov 2023 21:49:22 +0000 Subject: [PATCH] move quickselect to squiggle_more.c --- scratchpad/quickselect/makefile | 11 ----- scratchpad/quickselect/quickselect | Bin 16984 -> 0 bytes scratchpad/quickselect/quickselect.c | 69 --------------------------- squiggle.c | 10 ++++ squiggle_more.c | 45 +++++++++++++++++ 5 files changed, 55 insertions(+), 80 deletions(-) delete mode 100644 scratchpad/quickselect/makefile delete mode 100755 scratchpad/quickselect/quickselect delete mode 100644 scratchpad/quickselect/quickselect.c diff --git a/scratchpad/quickselect/makefile b/scratchpad/quickselect/makefile deleted file mode 100644 index 5bc70f0..0000000 --- a/scratchpad/quickselect/makefile +++ /dev/null @@ -1,11 +0,0 @@ -build: - gcc quickselect.c -lm -o quickselect - -run: - ./quickselect - -## Formatter -STYLE_BLUEPRINT=webkit -FORMATTER=clang-format -i -style=$(STYLE_BLUEPRINT) -format: - $(FORMATTER) quickselect.c diff --git a/scratchpad/quickselect/quickselect b/scratchpad/quickselect/quickselect deleted file mode 100755 index 6e47f82e41a4993cf32f38738fc4f0a74620aeac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16984 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 G#lHYeGH4wD diff --git a/scratchpad/quickselect/quickselect.c b/scratchpad/quickselect/quickselect.c deleted file mode 100644 index 6ddc4c2..0000000 --- a/scratchpad/quickselect/quickselect.c +++ /dev/null @@ -1,69 +0,0 @@ -#include -#include -#include - -void swp(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) -{ - // To understand this function: - // - see the note after gt variable definition - // - go to commit 578bfa27 and the scratchpad/ folder in it, which has printfs sprinkled throughout - int pivot = low + floor((high - low) / 2); - double pivot_value = xs[pivot]; - swp(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++) { - if (xs[i] < pivot_value) { - swp(gt, i, xs); - gt++; - } - } - swp(high, gt, xs); - 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() -{ - double xs[] = { 2.1, 1.0, 6.0, 4.0, 7.0, -1.0, 2.0, 10.0 }; - int length = 8; - int k = 2; - array_print(xs, 8); - double result = quickselect(k, xs, length); - printf("The item in pos #%d is: %f\n", k, result); - array_print(xs, 8); - return 0; -} diff --git a/squiggle.c b/squiggle.c index 99caacb..f8a61ad 100644 --- a/squiggle.c +++ b/squiggle.c @@ -196,6 +196,16 @@ double array_std(double* array, int length) return std; } +void array_print(double xs[], int n) +{ + printf("["); + for (int i = 0; i < n - 1; i++) { + printf("%f, ", xs[i]); + } + printf("%f", xs[n - 1]); + printf("]\n"); +} + // Mixture function double sample_mixture(double (*samplers[])(uint64_t*), double* weights, int n_dists, uint64_t* seed) { diff --git a/squiggle_more.c b/squiggle_more.c index 1ebadf4..1a63f99 100644 --- a/squiggle_more.c +++ b/squiggle_more.c @@ -30,6 +30,51 @@ typedef struct ci_searcher_t { int remaining; } ci_searcher; +void swp(int i, int j, double xs[]) +{ + double tmp = xs[i]; + xs[i] = xs[j]; + xs[j] = tmp; +} + +int partition(int low, int high, double xs[], int length) +{ + // To understand this function: + // - see the note after gt variable definition + // - go to commit 578bfa27 and the scratchpad/ folder in it, which has printfs sprinkled throughout + int pivot = low + floor((high - low) / 2); + double pivot_value = xs[pivot]; + swp(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++) { + if (xs[i] < pivot_value) { + swp(gt, i, xs); + gt++; + } + } + swp(high, gt, xs); + 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; + } + } +} + ci get_90_confidence_interval(double (*sampler)(uint64_t*), uint64_t* seed) { int n = 100 * 1000;