upload
This commit is contained in:
105
AnalysisWindow.xaml.cs
Normal file
105
AnalysisWindow.xaml.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user