forked from personal/squiggle.c
implement quickselect function
This commit is contained in:
parent
4a24a6b935
commit
578bfa2798
Binary file not shown.
|
@ -2,7 +2,83 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.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(){
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user