private static void CountSort(Element[] array) { List[] list = new List[MaxValue]; /* 1. Разпределяне на елементите по списъци */ for (int i = 0; i < MaxValue; i++) { list[i] = null; } /* 1.2. Добавяне на елемента в началото на списъка */ List p; for (int i = 0; i < array.Length; i++) { p = new List { Data = array[i], Next = list[array[i].Key] }; list[array[i].Key] = p; } /* 2. Извеждане на ключовете на сортираната последователност */ for (int i = 0, j = 0; i < MaxValue; i++) { while ((p = list[i]) != null) { array[j++] = list[i].Data; list[i] = list[i].Next; } } }
private static void Check(Element[] array, Element[] coppiedArray) { /* 1. Проверка за наредба във възходящ ред */ for (int i = 0; i < array.Length - 1; i++) { Debug.Assert(array[i].Key <= array[i + 1].Key, "Wrong order"); } /* 2. Проверка за пермутация на изходните елементи */ bool[] found = new bool[array.Length]; for (int i = 0; i < array.Length; i++) { int j; for (j = 0; j < array.Length; j++) { if (!found[j] && array[i].Equals(coppiedArray[j])) { found[j] = true; break; } } Debug.Assert(j < array.Length, "No element found"); /* Пропада, ако не е намерен съответен */ } }
internal static void Main() { Element[] array = new Element[MaxValue]; Element[] saveArray = new Element[MaxValue]; Initialize(array); Array.Copy(array, saveArray, array.Length); /* Запазва се копие на масива */ Console.WriteLine("Масивът преди сортирането"); Print(array); CountSort(array); Console.WriteLine("Масивът след сортирането"); Print(array); Check(array, saveArray); }
private static void Initialize(Element[] array) { for (int i = 0; i < array.Length; i++) { array[i].Key = rand.Next() % MaxValue; } }
private static void Print(Element[] array) { for (int i = 0; i < array.Length; i++) { Console.Write("{0} ", array[i].Key); } Console.WriteLine(); }