Дерево (лес) зависимостей -- как выстроить элементы в линию (список) в нужно порядке

Предположим, что:

  • у нас есть некоторое множество объектов, которые могут зависеть от других подобных им объектов (а те в свою очередь тоже и т.д.), а могут и не зависеть.
  • И есть задача: выстроить все объекты в линию, так, чтобы те, от которых зависят шли раньше, чем зависящие от них (для независимых порядок не важен).

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

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

Решение (возможный алгоритм)

Возможен такой алгоритм:

  1. Добавляем все объекты в некоторый массив A (проверяем, чтобы они не попали туда дважды)
  2. Создаём копию массива A -- массив B (в нем-то мы и будем сортировать элементы).
  3. Далее просматриваем этот массив A
  4. Перейдя к очередному элементу, смотрим зависят ли от него какой-либо другой из списка, если да -- определяем минимальный номер зависящего (позицию) и переставляем в массиве B наш текущий элемент перед зависимым элементом с минимальным номером (если он итак не стоял раньше), если же от данного элемента ничего не зависит, то просто переходим к следующему
  5. Повторяем предыдущий пункт пока не просмотрим весь массив A.

В итоге в массиве B мы получим элементы в правильном порядке.

Улучшенный алгоритм

Сортировка из предыдущего описания не понадобится, если при добавлении элементов в единственный массив A, мы будем сначала добавлять те элементы, от которых зависит данный, а потом уже все остальные.

Спасибо за подсказку Е. Ив.