def heap_sort(array: list):
    sorted_array = []
    heap = MinHeap(array)

    while len(heap) > 0:
        cur_min_val = heap.pop_min()
        sorted_array.append(cur_min_val)

    return sorted_array
def test_min_heap_heapify():
    heap = MinHeap([0, 1, 1, 2, 3])

    assert heap.min() == 0
    assert heap.pop_min() == 0
    assert heap.pop_min() == 1
    assert heap.pop_min() == 1
    assert heap.pop_min() == 2

    heap = MinHeap([1, 0, 2, 3, 1])

    assert heap.min() == 0
    assert heap.pop_min() == 0
    assert heap.pop_min() == 1
    assert heap.pop_min() == 1
    assert heap.pop_min() == 2
Exemple #3
0
Напишите программу, которая будет обрабатывать последовательность запросов таких видов:
CLEAR — сделать очередь с приоритетами пустой
(если в очереди уже были какие-то элементы, удалить все).
Действие происходит только с данными в памяти, на экран ничего не выводится.

ADD n — добавить в очередь с приоритетами число n.
Действие происходит только с данными в памяти, на экран ничего не выводится.

EXTRACT — вынуть из очереди с приоритетами минимальное значение.
Следует и изменить данные в памяти, и вывести на экран или найденное минимальное значение,
или, если очередь была пустой, слово "CANNOT" (большими буквами).
"""
from data_structure.heap import MinHeap

if __name__ == '__main__':
    heap = MinHeap()

    with open("input.txt") as file:
        for cur_line in file.readlines():

            if "ADD" in cur_line:
                val = int(cur_line.split()[1])
                heap.push(val)
            elif "CLEAR" in cur_line:
                heap = MinHeap()
            elif "EXTRACT" in cur_line:
                try:
                    print(heap.pop_min())
                except IndexError:
                    print("CANNOT")
Exemple #4
0
 def __init__(self):
     self.max_heap = MaxHeap()
     self.min_heap = MinHeap()
Exemple #5
0
class PrefixWithMedian:
    def __init__(self):
        self.max_heap = MaxHeap()
        self.min_heap = MinHeap()

    def insert(self, val) -> None:
        len_prefix = len(self.max_heap) + len(self.min_heap)

        if len_prefix <= 1:
            self.min_heap.push(val)
        else:
            ref_val = self.min_heap.min()

            if len_prefix % 2 == 0:
                self._insert_and_shift_median(val, ref_val)
            else:
                self._insert_and_keep_median(val, ref_val)

    def get_median(self):
        return self.min_heap.min()

    def get_prefix(self):
        raise NotImplemented

    def _insert_and_shift_median(self, new_val, cur_median) -> None:
        """
        Вставка элемента если индекс медианного элемента изменится

        Те
        len(prefix) % 2 = 0
        """
        if new_val < cur_median:
            self.max_heap.push(new_val)
        else:
            self.min_heap.pop_min()
            self.max_heap.push(cur_median)
            self.min_heap.push(new_val)

    def _insert_and_keep_median(self, new_val, cur_median) -> None:
        """
        Вставка элемента если индекс медианного элемента не изменится

        Те
        len(prefix) % 2 = 1
        """
        if new_val > cur_median:
            self.min_heap.push(new_val)
        else:
            if self.max_heap.max() < new_val:
                self.min_heap.push(new_val)
            else:
                last_max_heap = self.max_heap.pop_max()
                self.max_heap.push(new_val)
                self.min_heap.push(last_max_heap)
def test_min_heap_push():
    heap_min = MinHeap()
    heap_min.push(1)
    heap_min.push(2)
def test_min_heap_pop():
    heap_min = MinHeap()

    try:
        heap_min.pop_min()
    except:
        pass
    else:
        raise AssertionError

    heap_min.push(1)
    heap_min.push(3)
    assert heap_min.pop_min() == 1
    assert heap_min.min() == 3

    assert heap_min.pop_min() == 3

    try:
        heap_min.pop_min()
    except:
        pass
    else:
        raise AssertionError

    heap_min.push(5)
    heap_min.push(8)
    heap_min.push(9)

    assert heap_min.pop_min() == 5
    assert heap_min.pop_min() == 8
    assert heap_min.pop_min() == 9
def test_min_heap_min():
    heap_min = MinHeap()

    try:
        heap_min.min()
    except:
        pass
    else:
        raise AssertionError

    heap_min.push(1)
    assert heap_min.min() == 1

    heap_min.push(0)
    assert heap_min.min() == 0

    heap_min.push(3)
    assert heap_min.min() == 0