Oder eine Lösung, die ganu das tut, was ich denke, dass du tun möchtest:
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/perl
use strict;
use warnings 'all';
use Data::Dumper;
# NAME: sortieren()
# USE: Array nach dem angegebenen Algorithmus sortieren.
# PARAMETER: 1. Ausgangsarray
# 2. Gleich-Array
# 3. Ungleich-Array
# RETURNS: Koordinaten-Hash ( Referenz )
sub sortieren(\@\@\@)
{
# parameter holen
my($start, $gleich, $ungleich) = @_;
my $coords = {};
# ausgangsarray abarbeiten
while (@{$start})
{
# quellelement holen
my $quell = $start->[0];
# coordinaten array anlegen
my $co = $coords->{$quell} = [];
# nach gleichen elementen suchen
for my$j ($[..$#{$start})
{ push(@{$co}, $j) if $start->[$j] eq $quell }
# haben wir mehrere gleiche elemente?
if (@{$co} > 1)
{
# nach gleich kopieren
push(@{$gleich}, @{$start}[@{$co}]);
}
# quelle nach ungleich kopieren
push(@{$ungleich}, $quell);
# quellelement und duplikate aus dem start array loeschen
foreach my$ele (sort { $b <=> $a } @{$co})
{ splice(@{$start}, $ele, 1) }
}
# koordinaten der jeweiligen quellelemente zurueckgeben
return $coords;
} # sortieren
# Ausgangsarray initialisieren
my @arr = qw(Hans Maria Jochen Hans Maria Johann Hans Rainer);
# die beiden Arrays zum speichern der Werte definieren
my @gleich;
my @ungleich;
# sortieren
my $coords = sortieren(@arr, @gleich, @ungleich);
# ausgeben
print Dumper(\@arr, \@gleich, \@ungleich, $coords);
Ich denke die Vorgehensweise ist identisch mit deinem Algorithmus?
Du musst dir natürlich überlegen, ob du die Parameter wirklich so übergeben möchtest wie jetzt in dem Beispiel.
Es ist besser die Arrays als eindeutigere Referenzen zu übergeben, aber die Methode mit den \@ Prototypen wollte ich mal testen.
Wenn du die Übergabe ändern möchtest, musst du die \@ bei den Funktions-Prototypen durch drei $ ersetzen und unten beim Aufruf Referenzen an die Subroutine übergeben. In dem Biespiel also einfach einen \ vor die Arrays schieben.
MfG
edit: Die Stelle mit dem splice() an dem code nochmal aufgebessert, dank Ronnie\n\n
<!--EDIT|PerlProfi|1178189113-->