示例#1
0
        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));
        }
示例#2
0
        /// <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);
        }