曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3845|回复: 0
打印 上一主题 下一主题

哈希排序

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2011-10-13 19:38:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
哈希排序一般有两种情况,一种是根据键来排序,一种是根据值来排序。一般情况下,键多见于是字符串,而值多见于数字。在哈希的排序里同样可以使用 sort 和 reverse 两个函数。比较字符串的子程序里使用 cmp,比较数值的字符串里使用飞碟运算符 <=> 。

考虑下面代码:
[Perl] 纯文本查看 复制代码
#!/usr/bin/perl

%result = (
                "Jim"   => 50,
                "Tom"   => 38,
                "Ken"   => 68,
                "Lin"   => 87,
                "Win"   => 100,
          );

foreach $key (sort(keys %result)) {
        printf "%s%5d\n", $key, $result{$key};
}

#反序
print "\nReverse order:\n";
foreach $key (reverse sort(keys %result)) {
        printf "%s%5d\n", $key, $result{$key};
}
print "-----------------------\n";

sub ascending_sort {
        $result{$a} <=> $result{$b};
}

sub descending_sort {
        $result{$b} <=> $result{$a};
}

foreach $key (sort ascending_sort(keys(%result))) {
        printf "%s%5d\n", $key, $result{$key};
}
print "Descending sort by result: \n";
foreach $key (sort descending_sort(keys(%result))) {
        printf "%s%5d\n", $key, $result{$key};
}


运行输出:
$ ./sorthash.pl
Jim   50
Ken   68
Lin   87
Tom   38
Win  100

Reverse order:
Win  100
Tom   38
Lin   87
Ken   68
Jim   50
-----------------------
Tom   38
Jim   50
Ken   68
Lin   87
Win  100
Descending sort by result:
Win  100
Lin   87
Ken   68
Jim   50
Tom   38
程序中,$a 和 $b 是特殊变量,负责比较来自哈希 %result 的值。<=> 运算符以数值方式比较每个待排序的值,而 cmp 运算符则用来比较字符串,但在上面程序中没有使用。关于 cmp, <=>,$a, $b 和 sort 函数的更多信息可参考:
sort 函数, <=> 飞碟操作符, cmp 操作符


对于上面的排序,可能还 会遇到另外一种情况,比如有两个同学的分数是相同的,那么我们希望进一步比较它们的名字,也就是分数相同的人的名字按照 ASCII 排列,此时用 or 操作符可以解决这种情况,如:
[code=perl]sub ascending_sort {
        $result{$a} <=> $result{$b} or $a cmp $b;
}[/mw_shl_code]
这便是二级排序,当然可能会存在更复杂的情况需要更多级的排序,这时可以用多个 or 来连接 。注意一点,哈希表里面不会存在相同的键,所以上面的表达式不会返回 0 (分数和名字都相同时会返回0)。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-19 03:17 , Processed in 0.061883 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表