ADMB Documentation  11.1x.2711
 All Classes Files Functions Variables Typedefs Friends Defines
ivsort.cpp
Go to the documentation of this file.
00001 /*
00002  * $Id: ivsort.cpp 2599 2014-11-08 00:12:00Z 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 size=v.size();
00044 
00045    ivector intarray(0,size-1);
00046    for(int i=0;i<size;i++)
00047    {
00048       intarray[i] = v(lb+i);
00049    }
00050 
00051    if (size > 1)
00052    {
00053      int_qsort(&(intarray(0)), (unsigned int)size);
00054    }
00055 
00056    int ub=v.indexmax();
00057    ivector arr(lb, ub);
00058    for(int i=0;i<size;i++) {
00059       arr(lb+i) = intarray[i];
00060    }
00061 
00062    return arr;
00063 }
00064 
00074 ivector sort(const ivector &_v, const ivector &_index, int NSTACK)
00075 {
00076    ivector & index = (ivector &) _index;
00077    ivector & v = (ivector &) _v;
00078 
00079    if (v.size() != index.size())
00080    {
00081       cerr << " Incompatible array sizes in vector v and ivector index\n"
00082            << " in ivector sort(const ivector& v, const ivector& index)\n";
00083       ad_exit(1);
00084    }
00085 
00086    int lb=v.indexmin();
00087    int size=v.size();
00088 
00089    ivector intarray(0,size-1);
00090    for(int i=0;i<size;i++)
00091    {
00092       intarray[i] = v(lb+i);
00093    }
00094 
00095    ivector intarray2(0,size-1);
00096    for(int i=0;i<size;i++)
00097    {
00098       intarray2[i] = lb+i;
00099    }
00100 
00101    if (size > 1)
00102    {
00103      int_qsort2(&(intarray[0]),&(intarray2[0]), (unsigned int)size);
00104    }
00105 
00106    int ub=v.indexmax();
00107    ivector arr(lb, ub);
00108    for(int i=0;i<size;i++) {
00109       arr(lb+i) = intarray[i];
00110    }
00111 
00112    for(int i=0;i<size;i++) {
00113       index(index.indexmin()+i) = intarray2[i];
00114    }
00115 
00116    return arr;
00117 }