1
0
This commit is contained in:
Debug_pro
2026-06-07 18:14:39 +03:00
commit b74b40209b
24 changed files with 2528 additions and 0 deletions

105
AnalysisWindow.xaml.cs Normal file
View File

@@ -0,0 +1,105 @@
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();
}
}