Как создать сортировку Хоара для LinkedList на C#?

Нужно создать сортировку Хоара для двусвязных списков LinkedList на C#. Как её можно реализовать без использования индексаторов?
Вот мой код, но он не работает из-за выхода программы за границы связного списка. Также была замечена некорректная работа сортировки: алгоритм сначала правильно менял местами меньший и больший элементы (левее опорного элемента меньший, правее больший), но затем начинал большие элементы ставить левее опорного, а меньшие правее. Не знаю что не так, уже третий день бьюсь над этой задачей.
Буду рад прочитать как варианты исправлений ошибок в моём коде, так и варианты вашего исполнения данной сортировки на LinkedList.

using System;
using System.Collections.Generic;
namespace Упражнения
{
    class Program
    {
        public static void QuickSortLList(LinkedList<int> linkedList, LinkedListNode<int> Begin, LinkedListNode<int> End, int low, int high, int n)
        {
            // проверка отсортированности связного списка (т.к. linkedList не массив и индексов у него нет, то без такой  проверки код зацикливается)
            bool flag = true;
            LinkedListNode<int> Checking = linkedList.First;
            while (Checking.Next != null)
            {
                if (Checking.Value > Checking.Next.Value)
                {
                    flag = false;
                    break;
                }
                Checking = Checking.Next;
            }
            if (flag)
                return;

            // условные индексы для сортировки условных подсписков. Служат для начального определения границ условных подсписков
            int i = low;
            int j = high;

            int x = (Begin.Value + End.Value) >> 1;       //вычисление опорного элемента

            do
            {
                while (Begin.Value < x)
                {
                    ++i;
                    Begin = Begin.Next;
                }
                while (End.Value > x)
                {
                    --j;
                    End = End.Previous;
                }
                if (i <= j)
                {
                    int t = Begin.Value;
                    Begin.Value = End.Value;
                    End.Value = t;
                    i++;
                    Begin = Begin.Next;
                    j--;
                    End = End.Previous;
                }
            } while (i < j);

            Console.WriteLine("\n");

            if (low < j) QuickSortLList(linkedList, Begin, End, low, j, n);
            if (i < high) QuickSortLList(linkedList, Begin, End, i, high, n);
        }

        static void Main()
        {
            Console.Write("Введите размерность списка: ");
            int n = int.Parse(Console.ReadLine());
            Console.WriteLine();

            Random R = new Random();

            LinkedList<int> linkedList = new LinkedList<int>();
            for (int i = 0; i < n; i++)     //заполнение списка значениями
                linkedList.AddLast(R.Next(n - 1));

            QuickSortLList(linkedList, linkedList.First, linkedList.Last, 0, n - 1, n);
        }
    }
}

Ответы (0 шт):