Вы можете решить эту проблему, применяя X рекурсивно. Рассмотрим следующую подпрограмму Y:
- Учитывая массив длины
n
в качестве входных данных, мы сначала применяем метод X, чтобы найти средний m
входных чисел, это занимает много времени O(n)
.
- Затем мы сканируем входной массив, чтобы переупорядочить числа в массиве так, чтобы все числа, меньшие, чем
m
, находились в левой части массива, тогда как все числа, большие, чем m
, находятся в правой части массива (и m
находится в середине массива), обратите внимание, что этот шаг также занимает время O(n)
.
Следовательно, на входном массиве длины n
подпрограмма Y принимает O(n)
всего времени.
Так что, если вы рекурсивно применить подпрограмму Y к подмассивам слева и справа от срединной m
и продолжить процесс, выход будет отсортированный массивом и общее время определяется по формуле:
T(n) = O(n) + 2 * O(n/2) + 4 * O(n/4) + ... + 2^log(n) * O(n/2^log(n))
= O(n) + O(n) + O(n) + ... + O(n) // log(n) terms in total
= O(n log(n))
Google Quicksort –
Здесь вы идете большой парень: http://en.wikipedia.org/wiki/Quicksort – thang