本帖最后由 523066680 于 2019-1-28 21:47 编辑
在使用 pack 打包数据的情况下对二维数组排序。(以前写过一个普通版本的,参考:http://www.bathome.net/viewthread.php?tid=45306)
最初的方案是在 sort { } 内嵌函数中使用 unpack 释放数据逐项对比(每次都unpack会产生冗余消耗)。
但细想似乎不需要unpack,由于每一个字段都是对齐的,可以直接按字符串对比,操作上反而简单了:- =info
- 使用 pack 压缩数组的内存占用空间
- 二维不定长数组排序测试
- 523066680/vicyang
- =cut
- STDOUT->autoflush(1);
- srand(23);
- my @arr;
- print "Stage1\n";
- for (1 .. 20) {
- push @arr, pack("L*", reverse sort { $a <=> $b } map { int(rand(15)) } ( 1 .. rand(8)+2 ) );
- }
-
- print "Stage2\n";
- grep { print join(",", unpack "L*", $_ ),"\n" } reverse sort @arr;
复制代码
- 14,14,10,9,1
- 14,13,9,8,8,7,4,2,2
- 14,10,8
- 14,8,7,4,3,3,3,0,0
- 14,8,1
- 13,13,13,13,9,8,6,4
- 13,11,9,7,7,6,2,1
- 13,10,7,0
- 13,9,8,7,5,1,1,1,0
- 12,12,11,6,6,6,4,4,2
- 12,11,6
- 12,10,2,2,2,0
- 12,6
- 11,10,1,0
- 11,9,9,1,1,0
- 11,4,3
- 10,9,7,0
- 9,8,7,7,6,3,3,3,1
- 7,7,4,1
- 6,3
复制代码 (排序规则,以开头元素的数值优先排序,后面的其次,最后如果同列的数字都相等,按长度判定。) |