Сложность времени для сортировки Shell?

Во-первых, вот мой код сортировки Shell (с использованием Java):

public char[] shellSort(char[] chars) {
    int n = chars.length;
    int increment = n / 2;
    while(increment > 0) {
        int last = increment;
        while(last < n) {
            int current = last - increment;
            while(current >= 0) {
                if(chars[current] > chars[current + increment]) {
                    //swap
                    char tmp = chars[current];
                    chars[current] = chars[current + increment];
                    chars[current + increment] = tmp;
                    current -= increment;
                }
                else { break; }
            }
            last++;
        }
        increment /= 2;
    }
    return chars;
}

Является ли это правильной реализацией сортировки Shell (на данный момент мы забываем о наиболее эффективной последовательности пробелов - например, 1,3,7,21 ...)? Я спрашиваю, потому что слышал, что сложность времени в лучшем случае для сортировки оболочки - O (n). (Увидетьhttp://en.wikipedia.org/wiki/Sorting_algorithm). Я не вижу этого уровня эффективности, реализуемого моим кодом. Если бы я добавил к ней эвристику, то да, но в ее нынешнем виде нет.

При этом мой главный вопрос сейчас - мне трудно вычислить сложность времени Big O для моей реализации сортировки в Shell. Я определил, что самый внешний цикл как O (log n), средний цикл как O (n), а самый внутренний цикл также как O (n), но я понимаю, что внутренние два цикла на самом деле не будут O ( n) - они были бы намного меньше этого - какими они должны быть? Очевидно, что этот алгоритм работает намного эффективнее, чем O ((log n) n ^ 2).

Любое руководство очень ценится, поскольку я очень потерян! :П

Ответы на вопрос(1)

Ваш ответ на вопрос