ADMB Documentation  11.1.2551
 All Classes Files Functions Variables Typedefs Friends Defines
dvsort.cpp
Go to the documentation of this file.
00001 /*
00002  * $Id: dvsort.cpp 1657 2014-02-19 23:22:28Z johnoel $
00003  *
00004  * Copyright (c) 2009-2012 ADMB Foundation
00005  */
00011 #include <fvar.hpp>
00012 #include "qsort.h"
00013 
00017 void double_qsort(double *arr, unsigned n)
00018 {
00019   #define double_lt(a,b) ((*a)<(*b))
00020   QSORT(double, arr, n, double_lt);
00021 }
00022 
00026 void double_qsort2(double *arr, int *arr2, unsigned n)
00027 {
00028   #define double_lt(a,b) ((*a)<(*b))
00029   QSORT2(double, int, arr, arr2, n, double_lt);
00030 }
00031 
00040 dvector sort(const dvector & v, int NSTACK)
00041 {
00042    int lb=v.indexmin();
00043    int ub=v.indexmax();
00044    int size=v.size();
00045 
00046    double *doublearray;
00047    doublearray = new double[size];
00048    int i;
00049    for(i=0;i<size;i++)
00050    {
00051       doublearray[i] = v(lb+i);
00052    }
00053 
00054    double_qsort(doublearray,size);
00055 
00056    dvector arr(lb, ub);
00057    for(i=0;i<size;i++) {
00058       arr(lb+i) = doublearray[i];
00059    }
00060 
00061    delete [] doublearray;
00062 
00063    return arr;
00064 }
00065 
00075 dvector sort(const dvector &_v, const ivector &_index, int NSTACK)
00076 {
00077    ivector & index = (ivector &) _index;
00078    dvector & v = (dvector &) _v;
00079 
00080    if (v.size() != index.size())
00081    {
00082       cerr << " Incompatible array sizes in vector v and ivector index\n"
00083            << " in ivector sort(const ivector& v,const ivector& index)\n";
00084       ad_exit(1);
00085    }
00086 
00087    int lb=v.indexmin();
00088    int ub=v.indexmax();
00089    int size=v.size();
00090 
00091    double *doublearray = new double[size];
00092    for(int i = 0;i < size; i++)
00093    {
00094       doublearray[i] = v(lb+i);
00095    }
00096 
00097    int *intarray = new int[size];
00098    for(int i=0;i<size;i++)
00099    {
00100       intarray[i] = lb + i;
00101    }
00102 
00103    double_qsort2(doublearray,intarray,size);
00104 
00105    dvector arr(lb, ub);
00106    for(int i = 0;i < size; i++) {
00107       arr(lb+i) = doublearray[i];
00108    }
00109 
00110    for(int i = 0; i < size; i++) {
00111       index(index.indexmin()+i) = intarray[i];
00112    }
00113 
00114    delete[] doublearray;
00115    doublearray = 0;
00116 
00117    delete[] intarray;
00118    intarray = 0;
00119 
00120    return arr;
00121 }