perl 飞碟操作符{ $a <=> $b } 运行机制

2025-02-23 08:56:28
推荐回答(2个)
回答1:

首先, by_number 并没有读取过 @paixu,
而是 sort 赋值给了 $a 和 $b, 再调用 by_number 去解释 $a 和 $b.
所以, 如果你在 by_number 入面 print "@_", 你是会得到空值的.
也所以, 你写的 by_number 要跟著 sort 所给你的规范, 只能回传 -1 0 和 1

perl sort 的(内部)次序类似是这样的, 先将第一列,
尽量以两个两个一组来排(单数则先留下最後一个),
第一轮之後, sort 会记得最大和最小的值,

然後, 再以最大那个数开始, 对比最小那个数, 直至最後一个数

如果当中有比最大数有更大的数字出现 ( 例如之前说元素量为单数时被遗漏了的最後一个) ,
则会重新较正(重新记得一个最大数), 再依前面所说的次序做排列.

而其中的回圈数, 是 O(n log n) 至 O(n**2)次
顺带一提, sort 其实是数学的方法, 所以当中有很多 "门派", 如:
bubble sort, Cocktail sort, insertion sort, bucket sort, counting sort, merge sort
我们最初入门时学的 bubble sort :
for $i ( 1.. 10 ) {
for $j ( 1..10 ) {
...
}
}
是最没效率的. 而 Perl 用的, 就叫 "quick sort"

回答2:

读取的方式和sort的内部算法有关
你这里打印出的只是特定排序算法的取值比较步骤,这些细节无需关注