Я не уверен, что это самый быстрый способ, но, похоже, он работает.
Вся идея состоит в том, чтобы соединить точки, используя отрезки, не пересекающиеся (кроме точек, и этонемного сложнее определить, чем вы думаете).Поэтому начните с исходного несортированного списка, соедините их по порядку - образуя замкнутый путь, который может иметь много пересечений - и затем устраните пересечения по одному, изменив подпоследовательности точек в списке.* Предположим, мы начинаем с [abcdefgh] и обнаруживаем, что край bc пересекает край gh.Мы обращаемся к последовательности cg, чтобы получить новый список: [abgfedch].Два ребра были удалены и два новых созданы;остальные не потревожены (хотя у некоторых направление было изменено).
Мне не удалось найти случай, когда этот процесс будет выполняться вечно (то есть список вернется в предыдущее состояние),ни доказательство того, что это не может произойти.