network sorting for short arrays
This commit is contained in:
parent
2f48effddc
commit
c67549a296
113
qsort.h
113
qsort.h
@ -280,6 +280,119 @@ void myheapsort(INDEX n, DATA *ra,int typ=1)
|
||||
}
|
||||
|
||||
|
||||
//network up-sorting templates
|
||||
//more elegant would be a double template with N and partial specialization, but this is not allowed in current C++ for non-member functions
|
||||
//
|
||||
#define CONDSWAP(i,j) if(data[i]>data[j]) {T tmp=data[i]; data[i]=data[j]; data[j]=tmp; parity^=1;}
|
||||
|
||||
template<typename T>
|
||||
inline int netsort_0(T *data) {return 0;}
|
||||
|
||||
template<typename T>
|
||||
inline int netsort_1(T *data) {return 0;}
|
||||
|
||||
template<typename T>
|
||||
inline int netsort_2(T *data)
|
||||
{
|
||||
int parity=0;
|
||||
CONDSWAP(0,1);
|
||||
return parity;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
inline int netsort_3(T *data)
|
||||
{
|
||||
int parity=0;
|
||||
CONDSWAP(0,2);
|
||||
CONDSWAP(0,1);
|
||||
CONDSWAP(1,2);
|
||||
return parity;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
inline int netsort_4(T *data)
|
||||
{
|
||||
int parity=0;
|
||||
CONDSWAP(0,2);
|
||||
CONDSWAP(1,3);
|
||||
CONDSWAP(0,1);
|
||||
CONDSWAP(2,3);
|
||||
CONDSWAP(1,2);
|
||||
return parity;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
inline int netsort_5(T *data)
|
||||
{
|
||||
int parity=0;
|
||||
CONDSWAP(0,3);
|
||||
CONDSWAP(1,4);
|
||||
CONDSWAP(0,2);
|
||||
CONDSWAP(1,3);
|
||||
CONDSWAP(0,1);
|
||||
CONDSWAP(2,4);
|
||||
CONDSWAP(1,2);
|
||||
CONDSWAP(3,4);
|
||||
CONDSWAP(2,3);
|
||||
return parity;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
inline int netsort_6(T *data)
|
||||
{
|
||||
int parity=0;
|
||||
CONDSWAP(0,5);
|
||||
CONDSWAP(1,3);
|
||||
CONDSWAP(2,4);
|
||||
CONDSWAP(1,2);
|
||||
CONDSWAP(3,4);
|
||||
CONDSWAP(0,3);
|
||||
CONDSWAP(2,5);
|
||||
CONDSWAP(0,1);
|
||||
CONDSWAP(2,3);
|
||||
CONDSWAP(4,5);
|
||||
CONDSWAP(1,2);
|
||||
CONDSWAP(3,4);
|
||||
return parity;
|
||||
}
|
||||
|
||||
#undef CONDSWAP
|
||||
|
||||
|
||||
template<typename T>
|
||||
int netsort(const int n, T *data)
|
||||
{
|
||||
if(n<0) laerror("negative n in netsort");
|
||||
switch(n)
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
return 0;
|
||||
break;
|
||||
case 2:
|
||||
return netsort_2(data);
|
||||
break;
|
||||
case 3:
|
||||
return netsort_3(data);
|
||||
break;
|
||||
case 4:
|
||||
return netsort_4(data);
|
||||
break;
|
||||
case 5:
|
||||
return netsort_5(data);
|
||||
break;
|
||||
case 6:
|
||||
return netsort_6(data);
|
||||
break;
|
||||
default:
|
||||
return ptrqsortup<T,int>(data,data+n-1);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}//namespace
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user