private bool Sort(PairArray <int> pArray, Action <int, int> swapPairs) { var numbers = pArray.ValuesList; numbers.Sort(); var isSwapped = true; var count = 0; while (count < 3 && isSwapped) { if (pArray.ValuesList.SequenceEqual(numbers)) { return(true); } count++; isSwapped = false; for (var index = 0; index < 3; index++) { if (pArray.Values[index] > pArray.Values[index + 3]) { swapPairs(index, index + 2); isSwapped = true; } } } return(pArray.ValuesList.SequenceEqual(numbers)); }
/// <summary> /// Сортирует заданный массив с использованием <see cref="PairArray{T}"/> /// </summary> /// <remarks> /// При невозможности сортировки возвращает заданный массив. /// Во время работы записывает совершенные действия в свойство <see cref="Log"/>. /// </remarks> /// <param name="array"></param> /// <returns></returns> public int[] Sort(int[] array) { Log.Clear(); Debug.Print("Start sorting"); var pArray = new PairArray <int>(array); if (!IsSortable(array)) { Log.Add($"Нельзя отсортировать массив {pArray}: количество инверсий нечетно"); return(pArray.Values); } // Функция-замыкание, для использования PairArray.SwapPairs // с последующей записью действия в лог void swapPairs(int i1, int i2) { var buf = pArray.ToString(); var pair1 = pArray.GetPair(i1); var pair2 = pArray.GetPair(i2); pArray.SwapPairs(i1, i2); var msg = string.Join( " ", buf, pair1.Item1.ToString() + pair1.Item2.ToString(), "<->", pair2.Item1.ToString() + pair2.Item2.ToString() ); Debug.Print(msg); Log.Add(msg); } // Если массив не сортируется, пишем об этом информацию в лог и возвращаем массив if (!Sort(pArray, swapPairs)) { Log.Add($"Не удается массив {pArray}"); return(pArray.Values); } Log.Add(pArray.ToString()); Debug.Print("Stop sorting"); return(array); }