2023-11-29 20:04:41 +00:00
# include <math.h>
# include <stdio.h>
# include <stdlib.h>
2023-11-29 21:34:39 +00:00
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 ;
}
}
}
2023-11-29 20:04:41 +00:00
int main ( ) {
2023-11-29 21:34:39 +00:00
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 ) ;
2023-11-29 20:04:41 +00:00
return 0 ;
}