Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя
j,js,c,c+,r,t,a,mq  · 23 окт 2021

Оцените сложность алгоритма?

public final void fun(ArgInterface function, int lo, int hi) {
        T[] buf = this.array;
        int i = lo;
        int j = hi;
        int p = (i + j) >> 1;
        while ((i <= j)) {
            while (((i < hi) && (function.operation(i, p) < 0))) {
                ++i;
            }
            while (((j > lo) && (function.operation(j, p) > 0))) {
                --j;
            }
            if ((i <= j)) {
                T t = buf[i];
                buf[i++] = buf[j];
                buf[j--] = t;
            }
        }
        if ((lo < j)) {
            this.fun(function, lo, j);
        }

        if ((i < hi)) {
            this.fun(function, i, hi);
        }
    }
O(n)
O(Log(n))
O(n*Log(n))
O(n^2)
O(n^3)
16 проголосовали
Программирование+4
С первого взгляда может показаться, что тут линейная сложность, но если смотреть внимательнее, то видно, что в... Читать дальше
@Андрей Харченко, это алгоритм простой qsort, но с возможностью обратного вызова по интерфейсу. В основном такая сортировка применяется для обработки списка, когда данные по сортировки находиться еще и за пределами логики сортировки и должны быть подтверждены другими методами. Если это не учитывать тогда n*log(n), но тогда как оценить в общем масштабе сложность если под капотом function.operation(i, p) неизвестное действие.
=======
Реальный код на который я наткнулся и задумался об сложности исходя из логики.