1
0
Files
OAiP-Presnyakov_Ilya-Labora…/AnalysisWindow.xaml.cs
Debug_pro b74b40209b upload
2026-06-07 18:14:39 +03:00

106 lines
4.1 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Lab9.Models;
using Lab9.Services;
using Lab9.Strategies;
using System.Collections.ObjectModel;
using System.Text;
using System.Windows;
namespace Lab9;
public partial class AnalysisWindow : Window
{
private readonly IReadOnlyList<ISortStrategy> _strategies;
private readonly bool _descending;
private readonly ObservableCollection<AnalysisRow> _rows = new();
public AnalysisWindow(IReadOnlyList<ISortStrategy> strategies, bool descending)
{
InitializeComponent();
_strategies = strategies;
_descending = descending;
AnalysisDataGrid.ItemsSource = _rows;
Recalculate();
}
private void Recalculate_Click(object sender, RoutedEventArgs e)
{
Recalculate();
}
private void Close_Click(object sender, RoutedEventArgs e)
{
Close();
}
private void Recalculate()
{
_rows.Clear();
var sizes = new[] { 10, 100, 150 };
var random = new Random(4233);
var collected = new Dictionary<string, List<SortResult>>();
foreach (var strategy in _strategies)
{
collected[strategy.Name] = new List<SortResult>();
}
foreach (var size in sizes)
{
var baseArray = Enumerable.Range(0, size)
.Select(_ => random.Next(-250, 1000))
.ToArray();
var row = new AnalysisRow { ElementCount = size };
foreach (var strategy in _strategies)
{
var context = new SortingContext(strategy);
var result = context.Execute(baseArray, ascending: !_descending, enableLogging: false);
collected[strategy.Name].Add(result);
var cellText = $"C: {result.Metrics.Comparisons} | П: {result.Metrics.Moves} | В: {result.Elapsed.TotalMilliseconds:F6} мс";
switch (strategy)
{
case TimSortStrategy:
row.TimSort = cellText;
break;
case MsdRadixSortStrategy:
row.Msd = cellText;
break;
case CommunistSortStrategy:
row.Communist = cellText;
break;
}
}
_rows.Add(row);
}
AnalysisSummaryTextBlock.Text = BuildSummary(collected);
}
private string BuildSummary(Dictionary<string, List<SortResult>> collected)
{
var builder = new StringBuilder();
var timSortAverage = collected["TimSort"].Average(x => x.Elapsed.TotalMilliseconds);
var msdAverage = collected["MSD Radix Sort"].Average(x => x.Elapsed.TotalMilliseconds);
var communistAverage = collected["Коммунистическая сортировка"].Average(x => x.Elapsed.TotalMilliseconds);
builder.AppendLine(
timSortAverage <= msdAverage
? "• TimSort в среднем показал меньшее время на тестовых массивах."
: "• MSD в среднем показал меньшее время на тестовых массивах.");
builder.AppendLine("• MSD - алгоритм без прямого сравнения ключей, поэтому число сравнений у него заметно меньше либо равно нулю.");
builder.AppendLine("• TimSort удобен как гибрид: на малых участках он опирается на вставки, а затем выполняет слияние.");
builder.AppendLine("• Коммунистическая сортировка использует собственный принцип обработки массива и участвует в общем сравнительном анализе.");
builder.AppendLine(
$"• Среднее время: TimSort = {timSortAverage:F6} мс, MSD = {msdAverage:F6} мс, Коммунистическая = {communistAverage:F6} мс.");
return builder.ToString();
}
}