| c |
| 1 | // Функция для последнего прохода при поразрядной сортировке чисел с плавающей точкой template<class T> void floatRadixLastPass (short Offset, long N, T *source, T *dest, long *count) { T *sp; long s, c, i, *cp; uchar *bp; |
| 2 | long numNeg=0; for(i=128;i<256;i++) numNeg += count[i]; |
| 3 | s=numNeg; cp = count; for (i = 0; i < 128; ++i, ++cp) { c = *cp; *cp = s; s += c; } |
| 4 | // изменения, касающиеся обратного расположения отрицательных чисел. s = count[255] = 0; // cp = count+254; // for (i = 254; i >= 128; --i, --cp) {// *cp += s; // остальное - то же, что и в s = *cp; // signedRadixLastPass } |
| 5 | bp = (uchar *)source + Offset; sp = source; for (i = N; i > 0; --i, bp += sizeof(T) , ++sp) { cp = count + *bp; if (*bp<128) dest[ (*cp)++ ] = *sp; else dest[ --(*cp) ] = *sp; } } |
| 6 | // поразрядная сортировка чисел с плавающей точкой template<class T> void floatRadixSort (T* &in, long N) { T *out = new T[N]; ushort i; |
| 7 | long *counters = new long[sizeof(T)*256], *count; createCounters(in, counters, N); |
| 8 | for (i=0; i<sizeof(T)-1; i++) { count = counters + 256*i; if ( count[0] == N ) continue; radixPass (i, N, in, out,count); swap(in, out); } count = counters + 256*i; floatRadixLastPass (i, N, in, out,count); |
| 9 | delete in; in = out; delete counters; } |
Комментарии