00001
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "CTBgrab.hxx"
00015
00025
00026
00027 template <class T, class C>
00028 inline void CTBsortS<T,C>::operator()(CTBvector<T>& v)
00029 {
00030 CTBgrab<T> grab;
00031 C compare;
00032 T tmp;
00033
00034 for (CTBint m = v.Size()/2; m > 0; m = m/2) {
00035
00036 for (CTBint i = m; i < v.Size(); i++) {
00037 grab(tmp,v[i]);
00038 CTBint j = i-m;
00039
00040 while (j >= 0 && compare(tmp,v[j])) {
00041 grab(v[j+m],v[j]);
00042 j -= m;
00043 }
00044 grab(v[j+m],tmp);
00045 }
00046 }
00047
00048 return;
00049 }
00050
00051
00052
00053
00054
00055
00057
00058 template <class T, class C>
00059 inline void CTBsortS<T,C>::operator()(CTBvector<CTBint>& ind,
00060 const CTBvector<T>& v)
00061 {
00062 C compare;
00063
00064 ind.Resize(v.Size());
00065 for (CTBint i = 0; i < v.Size(); i++) ind[i] = i;
00066
00067 for (CTBint m = v.Size()/2; m > 0; m = m/2) {
00068
00069 for (CTBint i = m; i < v.Size(); i++) {
00070 CTBint tmp = ind[i];
00071 CTBint j = i-m;
00072
00073 while (j >= 0 && compare(v[tmp],v[ind[j]])) {
00074 ind[j+m] = ind[j];
00075 j -= m;
00076 }
00077 ind[j+m] = tmp;
00078 }
00079 }
00080
00081 return;
00082 }