commit 578bfa27987bfeb7ca57f2d98fb807005145d206
parent 4a24a6b93500e4b8f18f9bfd63124602dcfe2c0b
Author: NunoSempere <nuno.sempere@protonmail.com>
Date: Wed, 29 Nov 2023 21:34:39 +0000
implement quickselect function
Diffstat:
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;
}