Я пытаюсь написать программу, которая может читать из файла, затем помещать в сортировку кучи, а затем выводить в дереве вместе с отсортированным списком.Но я застрял, вместо того, чтобы пут был числами, используемыми в сортировке кучи, он просто размещал 1-10 на одной строке, а затем 1-9 на следующей.Я действительно запутался и едва понимаю этот язык как есть.Ниже приведен пример из приведенного ниже с результатами, которые я надеюсь получить.
#!/usr/bin/perl
use 5.006;
use strict;
use warnings;
use Tree::DAG_Node;
process_data(read_file('testing.txt'));
process_data((3,1,4,1,5,9,2,6,5,3,6));
sub read_file{
my($filename)=@_;
my @data=();
my @words;
open(my $fh, "<", $filename)
or die "Could not open file: $!\n";
while(<$fh>){
chomp;
@words = split(' ');
foreach my $word(@words){
push @data, $word;
}
}
close $fh;
return @data;
}
sub heap_sort {
my ($a) = @_;
my $n = @$a;
for (my $i = ($n - 2) / 2; $i >= 0; $i--) {
down_heap($a, $n, $i);
}
for (my $i = 0; $i < $n; $i++) {
my $t = $a->[$n - $i - 1];
$a->[$n - $i - 1] = $a->[0];
$a->[0] = $t;
down_heap($a, $n - $i - 1, 0);
}
}
sub down_heap {
my ($a, $n, $i) = @_;
while (1) {
my $j = max($a, $n, $i, 2 * $i + 1, 2 * $i + 2);
last if $j == $i;
my $t = $a->[$i];
$a->[$i] = $a->[$j];
$a->[$j] = $t;
$i = $j;
}
sub max {
my ($a, $n, $i, $j, $k) = @_;
my $m = $i;
$m = $j if $j < $n && $a->[$j] > $a->[$m];
$m = $k if $k < $n && $a->[$k] > $a->[$m];
return $m;
}
}
sub draw_tree{
my(@data)=@_;
my $root = Tree::DAG_Node->new;
$root->name($_[0]);
$root->new_daughter->name($_) for (1..10);
my @names = @data;
my $count = 50;
for my $n ($root->daughters) {
for (split //, $names[$count++]) {
$n->new_daughter->name($_)
}
}
print map "$_\n", @{$root->draw_ascii_tree};
}
sub process_data{
my(@data)=@_;
my @a = @data;
print "@a\n";
print "\n";
heap_sort(\@a);
draw_tree(@a);
print "\n";
print "@a\n";
print "\n";
}
вот вывод, который я получаю Вывод CMD моего кода
Вывод, который я ожидаю: (используя пример данных)
1 19 4 5
1
|
1 ----- 9
|
/\
4 5
1 1 4 5 9