Реализация восходящей сортировки слиянием для списков не работаетC#

Место общения программистов C#
Ответить
Anonymous
 Реализация восходящей сортировки слиянием для списков не работает

Сообщение Anonymous »

Я пытаюсь реализовать на C# псевдокод из Википедии для "Реализации BottomUp с использованием списков".
Вот псевдокод - и это не то, что можно было бы ожидать - например, длина подсписков не увеличивается в два раза, а просто увеличивается... :

Код: Выделить всё

function merge_sort(node head) is
// return if empty list
if head = nil then
return nil
var node array[32]; initially all nil
var node result
var node next
var int  i
result := head
// merge nodes into array
while result ≠ nil do
next := result.next;
result.next := nil
for (i = 0; (i < 32) && (array[i] ≠ nil); i += 1) do
result := merge(array[i], result)
array[i] := nil
// do not go past end of array
if i = 32 then
i -= 1
array[i] := result
result := next
// merge array into single list
result := nil
for (i = 0; i < 32; i += 1) do
result := merge(array[i], result)
return result
Они не предоставляют функцию merge(), поскольку она аналогична функциям в других реализациях.
Мой полный код C# приведен ниже.
Может ли кто-нибудь помочь с кодом, предпочтительно C#, который действительно реализует сортировку слиянием в списках?
Мой перевод псевдокода выше:

Код: Выделить всё

public static LinkedList? MSortList(LinkedListNode input)  // MergeSortExternal
{
if (input == null) return null;

var result = input;
LinkedListNode? next = null;
var workArea = new LinkedListNode?[32];

while(result != null)
{
var i = 0;
do
{
next = result.Next;
result = new LinkedListNode(result.Value);
result = Merge(workArea[i], result);
workArea[i] = null;
if (i == 31) i--;
i++;
workArea[i] = result;
result = next;
} while (result != null && i < 32 && workArea[i] != null);
}

result = null;
for(var i = 0; i < 32; i++)
{
result = Merge(workArea[i], result);
}
return result.List;
}

private static LinkedListNode Merge(LinkedListNode node1, LinkedListNode node2)
{
var resultList = new LinkedList();
while(node1 != null && node2 != null)
{
if(node1.Value 

Подробнее здесь: [url]https://stackoverflow.com/questions/79807465/mergesort-bottom-up-implementation-for-lists-is-not-working[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»