Поразрядная сортировка целых чисел с плавоющей точкой - Pascal
Формулировка задачи:
помогите пожалуйста решить задачу
Решение задачи: «Поразрядная сортировка целых чисел с плавоющей точкой»
textual
Листинг программы
// Функция для последнего прохода при поразрядной сортировке чисел с плавающей точкой template<class T> void floatRadixLastPass (short Offset, long N, T *source, T *dest, long *count) { T *sp; long s, c, i, *cp; uchar *bp; long numNeg=0; for(i=128;i<256;i++) numNeg += count[i]; s=numNeg; cp = count; for (i = 0; i < 128; ++i, ++cp) { c = *cp; *cp = s; s += c; } // изменения, касающиеся обратного расположения отрицательных чисел. s = count[255] = 0; // cp = count+254; // for (i = 254; i >= 128; --i, --cp) {// *cp += s; // остальное - то же, что и в s = *cp; // signedRadixLastPass } 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; } } // поразрядная сортировка чисел с плавающей точкой template<class T> void floatRadixSort (T* &in, long N) { T *out = new T[N]; ushort i; long *counters = new long[sizeof(T)*256], *count; createCounters(in, counters, N); 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); delete in; in = out; delete counters; }
Объяснение кода листинга программы
- В функции
floatRadixLastPass
переменнойs
присваивается значениеnumNeg
, которое представляет собой количество отрицательных чисел в массиве. - Переменные
cp
иcount
инициализируются значениемnumNeg
и адресом массиваcount
соответственно. - Затем происходит перераспределение отрицательных чисел, при этом их количество увеличивается на единицу.
- В цикле
for
происходит пересчет значенияs
и обновление значенийcp
иcount
. - Значение
s
присваивается новому адресуbp
, а переменныеsp
иbp
инициализируются значениемsource
и адресомsource
соответственно. - Затем происходит перенос чисел из исходного массива в новый массив
out
. - В цикле
for
происходит пересчет значенияs
и обновление значенийsp
иbp
. - После завершения цикла
for
происходит выделение памяти под новый массивout
с помощью оператораnew
. - В функции
floatRadixSort
создается новый массивout
с помощью оператораnew
. - Затем происходит создание нового массива
counters
с помощью оператораnew
и инициализация его значениемN
. - В цикле
for
происходит создание нового массиваcounters
с помощью оператораnew
и инициализация его значениемN
. - В функции
radixPass
переменнойi
присваивается значениеsizeof(T)-1
. - Затем происходит вызов функции
floatRadixLastPass
с аргументамиi
,N
,in
,out
иcount
. - После этого происходит вызов функции
swap
с аргументамиin
иout
. - В конце функция
floatRadixSort
удаляет исходный массивin
и выделяет память под новый массивout
с помощью оператораdelete
. - Затем происходит присвоение переменной
in
значенияout
и удаление массиваcounters
с помощью оператораdelete
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д