106 lines
4.1 KiB
C#
106 lines
4.1 KiB
C#
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();
|
||
}
|
||
}
|