run formatter in quickselect

This commit is contained in:
NunoSempere 2023-11-29 21:46:44 +00:00
parent 03ca3e3b0c
commit dc3f7eed4d
2 changed files with 62 additions and 51 deletions

View File

@ -3,3 +3,9 @@ build:
run: run:
./quickselect ./quickselect
## Formatter
STYLE_BLUEPRINT=webkit
FORMATTER=clang-format -i -style=$(STYLE_BLUEPRINT)
format:
$(FORMATTER) quickselect.c

View File

@ -2,30 +2,33 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
void swp(int i, int j, double xs[]){ void swp(int i, int j, double xs[])
{
double tmp = xs[i]; double tmp = xs[i];
xs[i] = xs[j]; xs[i] = xs[j];
xs[j] = tmp; xs[j] = tmp;
} }
void array_print(double xs[], int n){ void array_print(double xs[], int n)
{
printf("["); printf("[");
for(int i=0; i<n;i++){ for (int i = 0; i < n; i++) {
printf("%f, ", xs[i]); printf("%f, ", xs[i]);
} }
printf("]\n"); printf("]\n");
} }
int partition(int low, int high, double xs[], int length){ int partition(int low, int high, double xs[], int length)
{
// To understand this function: // To understand this function:
// - see the note after gt variable definition // - see the note after gt variable definition
// - go to commit 578bfa27 and the scratchpad/ folder in it, which has printfs sprinkled throughout // - go to commit 578bfa27 and the scratchpad/ folder in it, which has printfs sprinkled throughout
int pivot = low + floor((high-low)/2); int pivot = low + floor((high - low) / 2);
double pivot_value = xs[pivot]; double pivot_value = xs[pivot];
swp(pivot, high, xs); 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. */ 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++){ for (int i = low; i < high; i++) {
if(xs[i] < pivot_value){ if (xs[i] < pivot_value) {
swp(gt, i, xs); swp(gt, i, xs);
gt++; gt++;
} }
@ -34,17 +37,18 @@ int partition(int low, int high, double xs[], int length){
return gt; return gt;
} }
double quickselect(int k, double xs[], int length){ double quickselect(int k, double xs[], int length)
{
int low = 0; int low = 0;
int high = length - 1; int high = length - 1;
for (;;){ for (;;) {
if(low == high){ if (low == high) {
return xs[low]; return xs[low];
} }
int pivot = partition(low, high, xs, length); int pivot = partition(low, high, xs, length);
if(pivot == k){ if (pivot == k) {
return xs[pivot]; return xs[pivot];
}else if(k < pivot){ } else if (k < pivot) {
high = pivot - 1; high = pivot - 1;
} else { } else {
low = pivot + 1; low = pivot + 1;
@ -52,8 +56,9 @@ double quickselect(int k, double xs[], int length){
} }
} }
int main(){ int main()
double xs[] = {2.1, 1.0, 6.0, 4.0, 7.0, -1.0, 2.0, 10.0}; {
double xs[] = { 2.1, 1.0, 6.0, 4.0, 7.0, -1.0, 2.0, 10.0 };
int length = 8; int length = 8;
int k = 2; int k = 2;
array_print(xs, 8); array_print(xs, 8);