#include <algorithm>
#include <iostream>
struct IndexSorter
{
double * m_array;
IndexSorter( double * oArray) : m_array( oArray) { }
bool operator( ) ( long v1, long v2) const { return m_array[ v1] < m_array[ v2] ; }
} ;
long * IndexSort( unsigned long int vectorLength, double * column)
{
long * index = new long [ vectorLength] ( ) ; // I really don't recommend this line
for ( unsigned long i = 0 ; i < vectorLength; ++ i)
index[ i] = i;
std:: sort ( index, index + vectorLength, IndexSorter( column) ) ;
return index;
}
using namespace std;
int main( )
{
double testData[ ] = { 0.8147 ,0.9058 ,0.127 ,0.9134 ,0.6324 ,0.0975 ,0.2785 ,
0.5469 ,0.9575 ,0.9649 ,0.1576 ,0.9706 ,0.9572 ,0.4854 ,
0.8003 ,0.1419 ,0.4218 ,0.9157 ,0.7922 ,0.9595 } ;
unsigned long testSize = sizeof ( testData) / sizeof ( testData[ 0 ] ) ;
long * indices = IndexSort( testSize, & testData[ 0 ] ) ;
for ( unsigned long i = 0 ; i < testSize; ++ i )
cout << testData[ indices[ i] ] << " has an index of " << indices[ i] << "\n " ;
delete [ ] indices;
}
ICAgICNpbmNsdWRlIDxhbGdvcml0aG0+CiAgICAjaW5jbHVkZSA8aW9zdHJlYW0+CgogICAgc3RydWN0IEluZGV4U29ydGVyCiAgICB7CiAgICAgICBkb3VibGUgKm1fYXJyYXk7CiAgICAgICBJbmRleFNvcnRlcihkb3VibGUgKm9BcnJheSkgOiBtX2FycmF5KG9BcnJheSkge30KICAgICAgIGJvb2wgb3BlcmF0b3IoKShsb25nIHYxLCBsb25nIHYyKSBjb25zdCB7IHJldHVybiBtX2FycmF5W3YxXSA8IG1fYXJyYXlbdjJdOyB9CiAgICB9OwogICAgICAgICAgICAKICAgIGxvbmcqIEluZGV4U29ydCh1bnNpZ25lZCBsb25nIGludCB2ZWN0b3JMZW5ndGgsIGRvdWJsZSogY29sdW1uKQogICAgewogICAgICAgIGxvbmcgKmluZGV4ID0gbmV3IGxvbmdbdmVjdG9yTGVuZ3RoXSgpOyAvLyBJIHJlYWxseSBkb24ndCByZWNvbW1lbmQgdGhpcyBsaW5lCiAgICAgICAgZm9yICh1bnNpZ25lZCBsb25nIGkgPSAwOyBpIDwgdmVjdG9yTGVuZ3RoOyArK2kpIAogICAgICAgICAgICBpbmRleFtpXSA9IGk7CiAgICAgICAKICAgICAgICBzdGQ6OnNvcnQoaW5kZXgsIGluZGV4ICsgdmVjdG9yTGVuZ3RoLCBJbmRleFNvcnRlcihjb2x1bW4pKTsKICAgICAgICByZXR1cm4gaW5kZXg7CiAgICB9CgogICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiAgICBpbnQgbWFpbigpCiAgICB7ICAKICAgICAgZG91YmxlIHRlc3REYXRhW10gPSAgIHswLjgxNDcsMC45MDU4LDAuMTI3LDAuOTEzNCwwLjYzMjQsMC4wOTc1LDAuMjc4NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTQ2OSwwLjk1NzUsMC45NjQ5LDAuMTU3NiwwLjk3MDYsMC45NTcyLDAuNDg1NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuODAwMywwLjE0MTksMC40MjE4LDAuOTE1NywwLjc5MjIsMC45NTk1fTsKICAgICAgdW5zaWduZWQgbG9uZyB0ZXN0U2l6ZSA9IHNpemVvZih0ZXN0RGF0YSkgLyBzaXplb2YodGVzdERhdGFbMF0pOwogICAgICBsb25nICppbmRpY2VzID0gSW5kZXhTb3J0KHRlc3RTaXplLCAmdGVzdERhdGFbMF0pOwogICAgICBmb3IgKHVuc2lnbmVkIGxvbmcgaSA9IDA7IGkgPCB0ZXN0U2l6ZTsgKytpICkKICAgICAgICBjb3V0IDw8IHRlc3REYXRhW2luZGljZXNbaV1dIDw8ICIgIGhhcyBhbiBpbmRleCBvZiAiIDw8IGluZGljZXNbaV0gPDwgIlxuIjsKICAgICAgZGVsZXRlIFtdIGluZGljZXM7CiAgICB9Cgo=