Question

gsl provide APIs to sort a vector in ascending order, but, am I missing something to sort in descending order? I don't want "gsl_sort_largest" to create and extra vector.

Was it helpful?

Solution

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top