forked from personal/squiggle.c
run formatter in quickselect
This commit is contained in:
parent
03ca3e3b0c
commit
dc3f7eed4d
|
@ -3,3 +3,9 @@ build:
|
|||
|
||||
run:
|
||||
./quickselect
|
||||
|
||||
## Formatter
|
||||
STYLE_BLUEPRINT=webkit
|
||||
FORMATTER=clang-format -i -style=$(STYLE_BLUEPRINT)
|
||||
format:
|
||||
$(FORMATTER) quickselect.c
|
||||
|
|
|
@ -2,30 +2,33 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
void swp(int i, int j, double xs[]){
|
||||
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){
|
||||
void array_print(double xs[], int n)
|
||||
{
|
||||
printf("[");
|
||||
for(int i=0; i<n;i++){
|
||||
for (int i = 0; i < n; i++) {
|
||||
printf("%f, ", xs[i]);
|
||||
}
|
||||
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:
|
||||
// - 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);
|
||||
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){
|
||||
for (int i = low; i < high; i++) {
|
||||
if (xs[i] < pivot_value) {
|
||||
swp(gt, i, xs);
|
||||
gt++;
|
||||
}
|
||||
|
@ -34,17 +37,18 @@ int partition(int low, int high, double xs[], int length){
|
|||
return gt;
|
||||
}
|
||||
|
||||
double quickselect(int k, double xs[], int length){
|
||||
double quickselect(int k, double xs[], int length)
|
||||
{
|
||||
int low = 0;
|
||||
int high = length - 1;
|
||||
for (;;){
|
||||
if(low == high){
|
||||
for (;;) {
|
||||
if (low == high) {
|
||||
return xs[low];
|
||||
}
|
||||
int pivot = partition(low, high, xs, length);
|
||||
if(pivot == k){
|
||||
if (pivot == k) {
|
||||
return xs[pivot];
|
||||
}else if(k < pivot){
|
||||
} else if (k < pivot) {
|
||||
high = pivot - 1;
|
||||
} else {
|
||||
low = pivot + 1;
|
||||
|
@ -52,8 +56,9 @@ double quickselect(int k, double xs[], int length){
|
|||
}
|
||||
}
|
||||
|
||||
int main(){
|
||||
double xs[] = {2.1, 1.0, 6.0, 4.0, 7.0, -1.0, 2.0, 10.0};
|
||||
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);
|
||||
|
|
Loading…
Reference in New Issue
Block a user