/* Генерира примерно множество */ 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) { Node head = new Node { Next = c }; head.Next = c; Node a = Node.Z; for (int n = 1; a != head.Next; n <<= 1) { Node todo = head.Next; c = head; while (todo != Node.Z) { Node t = todo; /* Отделяне на a[] */ a = t; for (int i = 1; i < n; i++) { t = t.Next; } /* Отделяне на b[] */ Node b = t.Next; t.Next = Node.Z; t = b; for (int i = 1; i < n; i++) { t = t.Next; } /* Сливане на a[] и b[] */ todo = t.Next; t.Next = Node.Z; c.Next = Merge(a, b); /* Пропускане на слетия масив */ for (int i = 1; i <= n * 2; i++) { c = c.Next; } } } return head.Next; }
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); } }