/* Генерира примерно множество */ private static Node Generate(int n) { var rand = new Random(); Node p = Node.Z; 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) { /* Ако списъкът съдържа само един елемент: не се прави нищо */ if (c.Next == Node.Z) { return c; } Node a = c; Node b = c.Next.Next.Next; /* Списъкът се разделя на две части */ while (b != Node.Z) { b = b.Next.Next; c = c.Next; } b = c.Next; c.Next = Node.Z; /* Сортиране поотделно на двете части, последвано от сливане */ return Merge(MergeSort(a), MergeSort(b)); }
private static Node Merge(Node a, Node b) { /* Предполага се, че и двата списъка съдържат поне по един елемент */ Node tail = Node.Z; do { if (a.Value < b.Value) { tail.Next = a; tail = a; a = a.Next; } else { tail.Next = b; tail = b; b = b.Next; } } while (tail != Node.Z); tail = Node.Z.Next; Node.Z.Next = Node.Z; return tail; }
/* Извежда списъка на екрана */ private static void PrintList(Node p) { for (; p != Node.Z; p = p.Next) { Console.Write("{0,4}", p.Value); } }