How about reversing the sorted vector? As in using gsl_vector_reverse
. Simple test case as follows:
#include <stdlib.h>
#include <stdio.h>
#include <gsl/gsl_sort_float.h>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_vector.h>
void
pvec(const char *str, const gsl_vector *v, const int n)
{
int i = 0;
printf("%s", str);
for (i = 0; i < n; ++i) {
printf("v_%d = %g\n", i, gsl_vector_get(v, i));
}
}
int
main(int argc, char **argv)
{
int i = 0;
int n = 5;
const gsl_rng_type *T;
gsl_rng *r = NULL;
gsl_vector *v = gsl_vector_alloc(n);
T = gsl_rng_default;
r = gsl_rng_alloc(T);
for (i = 0; i < n; ++i) {
gsl_vector_set(v, i, gsl_rng_uniform(r));
}
pvec("Before sorting\n", v, n);
gsl_sort_vector(v);
pvec("\nAfter sorting\n", v, n);
gsl_vector_reverse(v);
pvec("\nAfter reversing\n", v, n);
gsl_rng_free(r);
gsl_vector_free(v);
return(EXIT_SUCCESS);
}
Which on compiling and running:
$ gcc -o svec svec.c -lgsl
$ ./svec
Before sorting
v_0 = 0.999742
v_1 = 0.16291
v_2 = 0.282618
v_3 = 0.947201
v_4 = 0.231657
After sorting
v_0 = 0.16291
v_1 = 0.231657
v_2 = 0.282618
v_3 = 0.947201
v_4 = 0.999742
After reversing
v_0 = 0.999742
v_1 = 0.947201
v_2 = 0.282618
v_3 = 0.231657
v_4 = 0.16291