от
Это попытка сделать heapsort как строить кучи только с функцией звонков. Проблема в том, что он берет слишком долго, дольше, чем проще сортировать пузырьком написано в одном проекте, почти 100 секунд 42 против пузыря с 100000 записей в порядке убывания. Сортировка слиянием и быстрая сортировка не прошел второй. Nevermind факт, что она падает на 100000, если компилятору не удается сделать хвост-вызов оптимизации. Он используется для аварии, некоторые детали на реализации там, чтобы сделать хвост-звонки случаются. Он был протестирован на нисходящие, восходящие и случайным образом распределенных данных. Некоторые изменения также были внесены исправления, как медленно он был, что они придают ей запутанный взгляд.
int heap_sort_step(int v[], int len, int i){
    int nextl = 2 * i   1, nextr = nextl   1;
    char bfl = (nextl heap_sort_step(v, len, nextr))
                swap(v   i, v   nextr);
        case 1:
            while(v[i] > heap_sort_step(v, len, nextl))
                swap(v   i, v   nextl);
        default:
            return v[i];
    }

}

void heap_sort(int v[], int len){
    return (len > 1)?
                (heap_sort_step(v, len, 0),
                 heap_sort(v   1, len 

heap_sort(в тип int[], int и лен) принимает массив и его размер и строит кучу мин для каждого элемента в массиве, используя heap_sort_step(), заказав его. Хвостовые вызовы нужны здесь.

heap_sort_step(в тип int[], int и лен инт я) принимает массив, его размер и указатель на строительство кучи, с уравнениями как видно в nextl и nextr, 2И 1 и 2i 2, начиная с i = 0. 'ОФЗ' оптимизация трюк(незначительные улучшения по сравнению с использованием КСФ), чтобы решить, какие ветки идти или просто возвращает текущее значение, видя, если есть несколько элементов вперед. Коммутатор использует проваливаемся и куда вляпались построен, 3 и 2 есть означает, что право (0b11, и 0b10) и 1 означает, что есть вещи, на левую (0b01), поведение по умолчанию возвращает текущее число. Это было написано как:

int heap_sort_step(int v[], int len, int i){
    int nextl = (((i   1) * 2) 

Как на рекурсивном шаге сравнивает номер текущего с возвратом значения из следующего вызова функции, а если больше-это свопы, если это не так, есть каскад вернуться к корню.

На данный момент я уверена, что это просто плохая реализация и хочу знать, если это проблема, сложность сделанные изменения или что-то другое. Это может быть сделано, чтобы конкурировать с сортировка слиянием и быстрая сортировка с использованием той же концепции? Она должна быть о(лог(Н)), верно?

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
...