1

说,我有一个清单:

@abc = (5,7,6,2,7,1);

我必须获得一个排序列表以及排序列表索引。所以输出将是:

@sorted_list = (7,7,6,5,2,1);
@sorted_list_index = (1,4,2,0,3,5);

我也在寻找一种非常有效的方法来解决这个问题,因为我实际上正在处理一个包含 2^16 个条目的长列表。

4

2 回答 2

13

如果要对索引进行排序,则需要生成它们

0..$#unsorted

然后你像其他任何东西一样对它们进行排序

my @sorted_indexes = sort { $unsorted[$b] <=> $unsorted[$a] } 0..$#unsorted;

可以使用切片来获取排序值。

my @sorted_values = @unsorted[ @sorted_indexes ];
于 2013-08-08T11:37:20.603 回答
0

这是我的解决方案:

use strict;
use warnings;

my @abc = (5,7,6,2,7,1);
my $i = 0;

#Create an array of hashes (with value and index)
my @temp_abc = map { {value=>$_, index=>$i++} } @abc;

#Sort by the value of each hash
my @sorted_temp_abc = sort { $b->{value} <=> $a->{value} } @temp_abc; 

#extract the values to array @sorted_list
my @sorted_list = map { $_->{value} } @sorted_temp_abc;

#extract the values to array @sorted_list_index
my @sorted_list_index = map { $_->{index} } @sorted_temp_abc;

print "@sorted_list\n";        #<-- prints: 7 7 6 5 2 1
print "@sorted_list_index\n";  #<-- prints: 1 4 2 0 3 5
于 2013-08-08T12:38:15.730 回答