private static Node Merge(Node a, Node b) { /* Предполага се, че и двата списъка съдържат поне по един елемент */ Node tail = new Node(); Node head = tail; while (true) { if (a.Value < b.Value) { tail.Next = a; a = a.Next; tail = tail.Next; if (a == null) { tail.Next = b; break; } } else { tail.Next = b; b = b.Next; tail = tail.Next; if (b == null) { tail.Next = a; break; } } } return head.Next; }
private static Node Generate(int n) { var rand = new Random(); Node p = null; for (int i = 0; i < n; i++) { var q = new Node { Value = rand.Next() % ((2 * n) + 1), Next = p }; p = q; } return p; }
private static Node MergeSort(Node c, int n) { /* Ако списъкът съдържа само един елемент: не се прави нищо */ if (n < 2) { return c; } Node a = c; int n2 = n / 2; /* Разделяне на списъка на две части */ for (int i = 2; i <= n2; i++) { c = c.Next; } Node b = c.Next; c.Next = null; /* Сортиране поотделно на двете части, последвано от сливане */ return Merge(MergeSort(a, n2), MergeSort(b, n - n2)); }
/* Извежда списъка на екрана */ private static void PrintList(Node p) { for (; p != null; p = p.Next) { Console.Write("{0,4}", p.Value); } }