Как создать сортировку Хоара для 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);
}
}
}