Python, алгоритм динамической сортировки

Рейтинг: 0Ответов: 0Опубликовано: 13.06.2023

Появилась необходимость создать алгоритм динамической сортировки (поочередно приходят числа, нужно выставлять их в ряд по возрастанию). Алгоритм обязан обладать следующими особенностями-

  1. Быть легко перестраиваемым при удалении элементов и внесении новых
  2. Обеспечивать быстрый поиск наименьшего значения

Пришел вот к такому алгоритму. Его суть похожа на дерево, только это не совсем дерево а цепочка. root'ом всегда является Node с наименьшим значением. Parent любого Node обладает значением большим, чем Node.

class Node:
    def __init__(self, value, parent=None, child=None):
        self.value = value
        self.parent = parent
        self.child = child


class Chain:
    def __init__(self):
        self.root = None

    def add(self, val):
        if not self.root:
            self.root = Node(val)
        else:
            self._add(val, self.root)

    def _add(self, val, node):
        if val > node.value:
            if not node.parent:
                node.parent = Node(val, child=node)
            else:
                if val <= node.parent.value:
                    node.parent = Node(val, child=node, parent=node.parent)
                    node.parent.parent.child = node.parent
                else:
                    if node.parent.parent:
                        self._add(val, node.parent.parent)
                    else:
                        node.parent.parent = Node(val, child=node.parent)
        else:
            if node.child:
                node.child = Node(val, child=node.child, parent=node)
            else:
                self.root = Node(val, parent=node)
                node.child = self.root

    def print_chain(self):
        print('my_sort[', end='')
        if self.root:
            self._print_chain(self.root)
        print(']', end='')

    def _print_chain(self, node):
        if node.parent:
            print(f'{node.value}, ', end='')
            self._print_chain(node.parent)
        else:
            print(f'{node.value}', end='')

От дерева отказался из за того, что его сложно перестраивать, то есть удалять элементы и вносить новые (если я ошибаюсь то поправьте пожалуйста). Получилось не очень здорово- проблемы с рекурсией если значений много. Скорость работы совсем не высокая. Я согласен расплатиться скоростью за возможность легко и быстро перестраивать цепочку- вносить новые элементы, удалять элементы, но не когда это настолько медленно. Возможно кто нибудь сможет посоветовать пути улучшения.

Ответы

Ответов пока нет.