Сортировка слиянием в C с O (N * log [N]) во время выполнения

Для задания мы должны написать функцию сортировки слиянием на C:

sort(int* array, unsigned len);

У меня есть код, написанный и работающий, но его время выполнения O(N^2*log[N]), что противоречит цели сортировки слиянием. Причина неэффективности заключается в том, что часть слияния выглядит следующим образом:

while(ct1 < len1 && ct2 < len2){
    if(array[0] < array[len1 - ct1]){
        ct1++;
        array++;    // no longer look at that element
    }
    else{
        int position = len1 - ct1;
        int hold = array[position];
        while(position > 0){
            array[position] = array[position - 1];
            position--;
        }
        array[0] = hold;
        ct2++;
        array++;
    }
}

где ct1 — счетчик для левого списка, ct2 — счетчик для правого списка, а массив — указатель на массив. И ct1, и ct2 изначально установлены равными нулю. Как я уже сказал, это работает, просто неэффективно, потому что приходится все перекладывать. Я хотел разбить вложенные массивы на два временных массива перед сортировкой, но вы якобы не можете создавать массивы, длина которых не определена как константы. Также должен отметить, что хотя я могу использовать вспомогательные функции, я не могу изменить параметры функции: должен быть указатель на массив и длина.


person Duncan    schedule 14.04.2011    source источник
comment
Вам нужно выделить некоторую память, скажем, не больше размера исходного массива, чтобы использовать ее в качестве временного пространства для подобных вещей. Вам разрешено использовать динамическое выделение памяти, верно?   -  person Mark Elliot    schedule 14.04.2011
comment
Вы можете создавать массивы динамически. Например, int tmp = (int)malloc(i*sizeof(int)).   -  person sarvesh    schedule 14.04.2011
comment
По модулю снимается неправильное приведение к возвращаемому значению malloc...   -  person R.. GitHub STOP HELPING ICE    schedule 14.04.2011
comment
malloc работает, но где именно выделяется память? Если это в стеке, то это лучше всего. Если нет, то как вы освобождаете его? Кстати, единственное ограничение, которое нам было дано, заключалось в том, что он должен быть рекурсивным, и мы не можем использовать какие-либо глобальные переменные. Вероятно, только 5 человек в классе вообще знают, что такое динамическое выделение памяти. Нам даже не дали ограничения по времени выполнения, но я перфекционист, и меня раздражает, когда что-то работает медленнее, чем сортировка выбором.   -  person Duncan    schedule 14.04.2011
comment
НВМ, понял. Спасибо всем.   -  person Duncan    schedule 14.04.2011


Ответы (1)


Вы можете создавать массивы не постоянной длины, google malloc. Сортировка слиянием требует использования дополнительной памяти для правильной работы. Вы должны free память, выделенную malloc, когда вы закончите с ней.

person sverre    schedule 14.04.2011
comment
На самом деле сортировка слиянием не требует использования дополнительной памяти. Это можно сделать на месте, т.е. известны алгоритмы, не использующие вспомогательную память, но они сложны и, возможно, бесполезны. - person user127.0.0.1; 14.04.2011