Beispiel #1
0
        //обработчик события окончания сортировки
        private void Sorting_OnSortingEndedEvent(InfoCalculating obj)
        {
            Dispatcher.InvokeAsync(() =>
            {
                //не советую использовать большие объемы списка для сортировки!!!

                ResultInfoCalculatingPanel.DataContext = obj;                     //выводим результат сортировки в ResultInfoCalculatingPanel
                GraphicContainer graphicContainer      = new GraphicContainer();  //создаем контэйнер для графиков
                Graphic graphic1 = new Graphic(Container.Length);                 //этот график в итоге будет представлять из себя прямую
                //еще один пример использования params, здесь мы указываем,
                graphic1.AddRangeXCoordinates(0, obj.CountElements);              //следовательно здесь мы переадаем 2 точки по оси Х
                graphic1.AddRangeYCoordinates(0, obj.TimeSorting);                //а здесь по оси У, чтобы построить прямую, необходимо 2 точки минимум

                ParabolaGraphic parabola = new ParabolaGraphic(Container.Length); //создаем параболу
                parabola.Fill();                                                  //заполняем значениями
                graphicContainer.ListGraphics.Add(graphic1);                      //добавялем в список созданный график

                graphicContainer.ListGraphics.Add(parabola);                      //добавляем прямую
                GraphImage.Source = graphicContainer.DrawingGraphic();            //источнику указываем результат отрисовки графика
            });
        }
Beispiel #2
0
        public override Task <InfoCalculating> StartSoring()
        {
            return(Task.Run(() =>
            {
                int count = 0;            //количество сравнений
                int countComparisons = 0; //количество перестановок
                InfoCalculating result = null;

                StopWatch = Stopwatch.StartNew();

                for (int i = 1; i < Container.Length; i++)
                {
                    for (int j = i; j > 0; j--)// пока j>0 и элемент j-1 > j, x-массив int
                    {
                        count++;
                        if (Container[j - 1].IsMore(Container[j]))
                        {
                            countComparisons++;
                            Container.Swap(j - 1, j);// меняем местами элементы j и j-1
                            OnCurrentStateItems();
                        }
                    }
                }

                result = new InfoCalculating()
                {
                    CountChecks = count,
                    CountComparisons = countComparisons,
                    TimeSorting = StopWatch.ElapsedMilliseconds,
                    CountElements = Container.Length
                };
                StopWatch.Reset();
                OnSortingEnded(result);

                return result;
            }));
        }
Beispiel #3
0
        //Реализуем сортировку шейкером (оборчивая результат в Task означает то, что мы будем будем ожидать выполнения метода (асинхронные операции))
        public override Task <InfoCalculating> StartSoring()
        {
            //запускаем задачу на выполнение (Run принимает делегат Action - делегает без параметров)
            //C# позволяет упростить вызов таких делегатов лямбда-выражениями
            //() - такие скобочки в данном случае будут означать метод без параметров
            //=> - это лямбда-выражение, следом за ними идут скобочки - это тело метода
            //можно было создать отдельный метод, в котором была бы реализована логика ниже
            return(Task.Run(() =>
            {
                int left = 0;
                int right = Container.Length;
                int count = 0;            //количество сравнений
                int countComparisons = 0; //количество перестановок
                InfoCalculating result = null;

                StopWatch = Stopwatch.StartNew();

                while (true)
                {
                    bool check = left >= right;//смотрим, достигли ли мы серидины

                    if (check)
                    {
                        break;                            //если достигли, то выходим из цикла
                    }
                    var res = BubbleOnewWay(left, right); //идем слева направо
                    right--;                              //после прохода правую границу уменьшаем на 1

                    count += res.CountChecks;             //прибавляем кол-во проверок

                    //если количество перестановок равно нулю, значит что мы уже имеем отсортированный массив, следовательно выходим из цикла
                    if (res.CountComparisons == 0)
                    {
                        break;
                    }

                    countComparisons += res.CountComparisons;//прибавляем кол-во перестановок


                    if (check)
                    {
                        break;                        //если достигли, то выходим из цикла
                    }
                    res = BubbleOnewWay(right, left); //идем справа налево
                    left++;                           //после прохода увеличиваем левую границу на 1

                    count += res.CountChecks;         //прибавляем кол-во проверок

                    //если количество перестановок равно нулю, значит что мы уже имеем отсортированный массив, следовательно выходим из цикла
                    if (res.CountComparisons == 0)
                    {
                        break;
                    }

                    countComparisons += res.CountComparisons;//прибавляем кол-во перестановок
                }

                //создаем переменную типа InfoCalculating, в которой сохраняем результаты сортировки
                result = new InfoCalculating()
                {
                    CountChecks = count,
                    CountComparisons = countComparisons,
                    TimeSorting = StopWatch.ElapsedMilliseconds,
                    CountElements = Container.Length
                };
                StopWatch.Reset();      //сбрасываем таймер
                OnSortingEnded(result); //уведомляем о том, что сортировка завершена
                return result;
            }));
        }
Beispiel #4
0
 //метод, который вызывает событие OnSortingEndedEvent, в параметрах указываем результат сортировки
 protected void OnSortingEnded(InfoCalculating info)
 {
     OnSortingEndedEvent?.Invoke(info);
 }