Поразрядная сортировка целых чисел с плавоющей точкой - 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;
}

Объяснение кода листинга программы

  1. В функции floatRadixLastPass переменной s присваивается значение numNeg, которое представляет собой количество отрицательных чисел в массиве.
  2. Переменные cp и count инициализируются значением numNeg и адресом массива count соответственно.
  3. Затем происходит перераспределение отрицательных чисел, при этом их количество увеличивается на единицу.
  4. В цикле for происходит пересчет значения s и обновление значений cp и count.
  5. Значение s присваивается новому адресу bp, а переменные sp и bp инициализируются значением source и адресом source соответственно.
  6. Затем происходит перенос чисел из исходного массива в новый массив out.
  7. В цикле for происходит пересчет значения s и обновление значений sp и bp.
  8. После завершения цикла for происходит выделение памяти под новый массив out с помощью оператора new.
  9. В функции floatRadixSort создается новый массив out с помощью оператора new.
  10. Затем происходит создание нового массива counters с помощью оператора new и инициализация его значением N.
  11. В цикле for происходит создание нового массива counters с помощью оператора new и инициализация его значением N.
  12. В функции radixPass переменной i присваивается значение sizeof(T)-1.
  13. Затем происходит вызов функции floatRadixLastPass с аргументами i, N, in, out и count.
  14. После этого происходит вызов функции swap с аргументами in и out.
  15. В конце функция floatRadixSort удаляет исходный массив in и выделяет память под новый массив out с помощью оператора delete.
  16. Затем происходит присвоение переменной in значения out и удаление массива counters с помощью оператора delete.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.571 из 5
Похожие ответы