//Определение порядка run'a и его поиск через метод FindRun //Возвращает длину run'а и его порядок сортировки private int RunFragmentation(out RunOrder runOrder) { if (currentIndex >= arr.Length - 1) //Если остался один элемент в массиве, то вернуть размер равный 1 { currentIndex++; runOrder = RunOrder.LowerOrEqual; return(1); } runOrder = arr[currentIndex].CompareTo(arr[currentIndex + 1]) <= 0 ? RunOrder.LowerOrEqual : RunOrder.Higher; int runSize = FindRun(runOrder); return(runSize); }
//Поиск run'a в определенном упорядоченной последовательности //Возвращает длину run'a private int FindRun(RunOrder runOrder) { currentIndex++; int runSize = 2; bool isWorks = true; do { if (currentIndex + 1 < arr.Length && (arr[currentIndex].CompareTo(arr[currentIndex + 1]) <= 0 && runOrder == RunOrder.LowerOrEqual || arr[currentIndex].CompareTo(arr[currentIndex + 1]) > 0 && runOrder == RunOrder.Higher) ) { runSize++; } else { isWorks = false; } currentIndex++; } while (isWorks); return(runSize); }