Причина, по которой вы получаете исключение IndexOutOfBoundsException, заключается в том, что вы создаете совершенно новый List<Point> auxiliaryList
каждый раз, когда вызывается mergeForUpperHull. Таким образом, в сценарии, где low = mid = 2, вы будете вставлять (добавлять) только один элемент в новый дополнительный список, который не будет соответствовать среднему индексу, который вы пытаетесь получить из дополнительного списка в системе.
Есть другие проблемы с кодом, но я предполагаю, что вы просто находитесь в режиме блокнота. Но чтобы дать вам верное направление, я бы не использовал два вспомогательных списка в методе слияния, вместо этого я буду использовать основной список для выполнения операций сравнения и обмена. Помните, что если вы просто добавите во вспомогательный список для каждой операции слияния, у вас будет больше данных в окончательном списке в результате всплытия из-за рекурсивных вызовов dcHullForUpperHull.
Если быть более точным, в результате вы получите (Log2(size of list)+1)*(size of list)
элементов из выполняемого слияния (при условии, что вы не создаете новый список каждый раз)
Алгоритмы «разделяй и властвуй» - отличные учебные упражнения, поэтому я не буду здесь выкладывать полный код, но вышеприведенное должно быть подходящим для вас способом завершить вышеупомянутую сортировку слиянием