private static void Check(Element[] m, Element[] saveM, uint n) { bool[] found = new bool[n + 1]; /* третира се като масив от булев тип */ /* 1. Проверка за наредба във възходящ ред */ for (int i = 0; i < n - 1; i++) { if (m[i].Key <= m[i + 1].Key == false) { Environment.Exit(0); } } /* 2. Проверка за пермутация на изходните елементи */ int j; for (int i = 0; i < n; i++) { for (j = 0; j < n; j++) { if (found[j] == false && m[i].Key == saveM[j].Key) { found[j] = true; break; } } /* Пропада, ако не е намерен съответен */ if (j < n == false) { Environment.Exit(0); } } }
/* Запълва масива със случайни цели числа */ private static void Init(Element[] m, uint n) { Random rand = new Random(); for (int i = 0; i < n; i++) { m[i].Key = (int)(rand.Next() % n); } }
/* Извежда ключовете на масива на екрана */ private static void Print(Element[] m, uint n) { for (int i = 0; i < n; i++) { Console.Write("{0,4}", m[i].Key); } Console.WriteLine(); }
internal static void Main(string[] args) { Element[] m = new Element[Max]; Element[] saveM = new Element[Max]; uint loopInd; Console.WriteLine("start -- "); for (loopInd = 1; loopInd <= TestLoopCnt; loopInd++) { Init(m, Max); m.CopyTo(saveM, 0); /* Запазва се копие на масива */ Console.WriteLine("Масивът преди сортирането:"); Print(m, Max); ShakerSort(m, Max); Console.WriteLine("Масивът след сортирането:"); Print(m, Max); Check(m, saveM, Max); } }
private static void ShakerSort(Element[] m, uint n) { uint k = n, r = n - 1; uint l = 1; do { for (uint j = r; j >= l; j--) { if (m[j - 1].Key > m[j].Key) { Swap(ref m[j - 1], ref m[j]); k = j; } } l = k + 1; for (uint j = l; j <= r; j++) { if (m[j - 1].Key > m[j].Key) { Swap(ref m[j - 1], ref m[j]); k = j; } } r = k - 1; } while (l <= r); }
private static void Swap(ref Element x1, ref Element x2) { Element tmp = x1; x1 = x2; x2 = tmp; }