在这个修改过的快速排序算法中,我正在解析/重写个人项目的一部分,在Perl中:
sub quick_sort {
my @a = @_;
return @a if @a < 2;
my $p = splice @a, int( $#a / 2 ), 1;
(
quick_sort( grep $_ < $p, @a ),
$p,
quick_sort( grep $_ >= $p, @a ),
);
}
print "Enter a list of numbers, separated by commas (e.g. 2,5,1,7): ";
my @a = split ",", <STDIN>;
@a = quick_sort(@a);
chomp(@a);
print "@a\n";
我很困惑这个陈述,或者更确切地说,用逗号分隔的一组陈述(我猜?):
quick_sort(grep $_ < $p, @a),
$p,
quick_sort(grep $_ >= $p, @a);
我甚至不知道那叫什么,所以谷歌搜索“用逗号分隔的perl语句”之类的东西没有用。我已经通过用分号分隔它们进行了实验,但是当我尝试时输出是不正确的。这叫什么,它在做什么?
答案 0 :(得分:2)
这三个最后一行形成一个语句,其结果是一个列表:
quick_sort(grep $_ < $p, @a), $p, quick_sort(grep $_ >= $p, @a);
该列表是子程序的结果。如果使用semmicolon,则子例程的结果为:
quick_sort(grep $_ >= $p, @a);
这是不正确的。
答案 1 :(得分:0)
这是对子程序的递归调用。这就是它真正的作用:
sub quick_sort {
## Grabs the list passed from the main body in to an array a
my @a = @_;
## If the scalar value of array is less than 2
## then no sorting is needed so return the array as is
return @a if @a < 2;
## If not then grab one element which is from the middle of the array
my $p = splice (@a, int($#a / 2), 1);
## Call your method in recursion with list of 3 elements, first being an element smaller
## than the sliced, the element obtained from slice and an element
## greater than or equal to the sliced one
quick_sort(grep $_ < $p, @a), $p, quick_sort(grep $_ >= $p, @a);
}
由于slice是破坏性函数,因此在每次迭代时,您的数组将缩小到满足以下条件并退出的程度。
return @a if @a < 2;