Да, это возможно.Это будет выполняться во время O(k n)
, где n
- размер вашего массива.
Вам лучше использовать heapsort.Вместо этого он будет работать во времени O(n + k log(n))
.Шаг кучи - O(n)
, затем каждый извлеченный элемент - O(log(n))
.
Техническое примечание.Если вы умны, вы создадите кучу задом наперед до конца вашего массива.Поэтому, когда вы думаете о нем как о дереве, поместите n-2i, n-2i-1
th элементы ниже n-i
th.Итак, возьмите ваш массив:
{5, 3, 8, 1, 6, 2, 8, 3, 10}
Это дерево примерно так:
10
3
2
3
5
6
8
1
8
Когда мы кучи, мы получаем дерево:
1
2
3
3
5
6
8
10
8
Что означаетскажем массив:
{5, 3, 8, 10, 6, 3, 8, 2, 1}
И теперь для извлечения каждого элемента требуется переместить последний элемент в конечное местоположение, а затем позволить большому элементу "упасть на дерево".Например:
# swap
{1*, 3, 8, 10, 6, 3, 8, 2, 5*}
# the 5 compares with 8, 2 and swaps with the 2:
{1, 3, 8, 10, 6, 3, 8?, 5*, 2*}
# the 5 compares with 3, 6 and swaps with the 3:
{1, 3, 8, 10, 6?, 5*, 8, 3*, 2}
# The 5 compares with the 3 and swaps, note that 1 is now outside of the tree:
{1, 5*, 8, 10, 6, 3*, 8, 3, 2}
Что в представлении массива:
{1}
2
3
3
5
6
8
10
8
Повторите еще раз, и мы получим:
# Swap
{1, 2, 8, 10, 6, 3, 8, 3, 5}
# Fall
{1, 2, 8, 10, 6, 5, 8, 3, 3}
aka:
{1, 2}
3
3
5
6
8
10
8
И снова:
# swap
{1, 2, 3, 10, 6, 5, 8, 3, 8}
# fall
{1, 2, 3, 10, 6, 8, 8, 5, 3}
или
{1, 2, 3}
3
5
8
6
8
10
И т. Д.