//обработчик события окончания сортировки 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(); //источнику указываем результат отрисовки графика }); }
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; })); }
//Реализуем сортировку шейкером (оборчивая результат в 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; })); }
//метод, который вызывает событие OnSortingEndedEvent, в параметрах указываем результат сортировки protected void OnSortingEnded(InfoCalculating info) { OnSortingEndedEvent?.Invoke(info); }