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