Perl에서 병합 정렬을 구현하려고했지만 Perl을 처음 접했고 배열 참조에 문제가 있음을 알고 있습니다. 배열은 프로세스가 완료된 후에 같은 값을 유지합니다. 내가 어디로 잘못 가고 있는지 보지 못하게 해주세요.Perl mergesort - 배열 참조
수정 된 코드 : $auxref
및 $aref
:
use strict;
use warnings;
my (@aref, @auxref) =();
my ($hi, $lo, $i, $j, $k, $n) = 0;
@aref = (5, 7, 6, 3, 4, 1, 8, 9, 4);
$n = @aref;
mergeSort(\@aref, \@auxref, 0, $n - 1);
print "@auxref\n";
print "@aref\n";
sub mergeSort {
my ($aref) = $_[0];
my ($auxref) = $_[1];
my $lo = $_[2];
my $hi = $_[3];
if ($hi <= $lo) { return; }
my $mid = 0;
$mid = int($lo + ($hi - $lo)/2);
mergeSort($aref, $auxref, $lo, $mid);
mergeSort($aref, $auxref, $mid + 1, $hi);
merge($aref, $auxref, $lo, $mid, $hi);
}
sub merge {
my ($aref) = $_[0];
my ($auxref) = $_[1];
my $lo = $_[2];
my $mid = $_[3];
my $hi = $_[4];
for ($i = $lo ; $i <= $hi ; $i++) {
$auxref->[$i] = $aref->[$i];
}
$i = $lo;
$j = $mid + 1;
for ($k = $lo ; $k <= $hi ; $k++) {
if ($i > $mid) {
$aref->[$k] = $auxref->[$j];
$j++;
}
elsif ($j > $hi) {
$aref->[$k] = $auxref->[$i];
$i++;
}
elsif ($auxref->[$i] <= $auxref->[$j]) {
$aref->[$k] = $auxref->[$i];
$i++;
}
else {
$aref->[$k] = $auxref->[$j];
$j++;
}
}
}
시도해도 여전히 작동하지 않았습니다. 위의 코드를 업데이트했습니다. – chettyharish
addition ->도 도움이되지 않았다. – chettyharish
'merge' 하위에'$ auxref [$ i] = $ aref [$ i]'가 남아 있습니다. 따라서 실제로 병합 서브의 시작 부분에서 선언 한 배열 참조가 아니라 4 행에서 정의한 배열을 참조합니다. – aidan