Вот псевдокод - и это не то, что можно было бы ожидать - например, длина подсписков не увеличивается в два раза, а просто увеличивается... :
Код: Выделить всё
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
Мой полный код 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]
Мобильная версия