Thread Liste von Arrays sortieren (14 answers)
Opened by scriptor at 2018-04-12 08:54

clms
 2018-04-13 14:02
#188274 #188274
User since
2010-08-29
373 Artikel
BenutzerIn
[default_avatar]
Wenn Du die Aussagen von Linuxer nachvollziehen willst, kannst du folgenden Code verwenden:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
my $cnt_sort = 0;
my $cnt_sort_schwartz = 0;
my $cnt_cmp_sort = 0;
my $cnt_cmp_sort_schwartz = 0;

my @array = (
    [25,1],
    [3,7],
    [1,2],
    [2,4],
    [2,2],
    [35,34],
);

# Native
my @dummy = sort{ $cnt_cmp_sort++; helper($a) <=> helper($b) }@array ;

# nach Schwartz
my @dummy_schwartz = 
    map{$_->[0]}
    sort{$cnt_cmp_sort_schwartz++;  $a->[1] <=> $b->[1] }
    map{[$_, helper_schwartz($_)]} @array;

print "Anzahl der Helper-Aufrufe cnt_sort: $cnt_sort\n";
print "Anzahl der Helper-Aufrufe cnt_sort_schwartz: $cnt_sort_schwartz\n";
print "Anzahl der Vergleiche cnt_cmp_sort: $cnt_cmp_sort\n";
print "Anzahl der Vergleiche cnt_cmp_sort_schwartz: $cnt_cmp_sort_schwartz\n";

sub helper{
    my $ref = shift;
    $cnt_sort++;
    return abs($ref->[1] - $ref->[0]); 
}

sub helper_schwartz{
    my $ref = shift;
    $cnt_sort_schwartz++;
    return abs($ref->[1] - $ref->[0]); 
}

Du wirst feststellen, dass die Anzahl der Vergleiche bei beiden Varianten immer gleich ist, nur die Anzahl der Aufrufe der helper-Funktion ändert sich. Bei der Standard-Sortierfunktion ist sie immer doppelt so hoch wie die Anzahl der Vergleiche (schließlich wird sie für jedes der beiden Argumente des Vergleichs neu ausgeführt), während sie bei der Schwartzschen Version der Anzahl der Listenelemente entspricht.

View full thread Liste von Arrays sortieren