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 _strategies; private readonly bool _descending; private readonly ObservableCollection _rows = new(); public AnalysisWindow(IReadOnlyList 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>(); foreach (var strategy in _strategies) { collected[strategy.Name] = new List(); } 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> 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(); } }