说,我有一个清单:
@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 个条目的长列表。
说,我有一个清单:
@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 个条目的长列表。
如果要对索引进行排序,则需要生成它们
0..$#unsorted
然后你像其他任何东西一样对它们进行排序
my @sorted_indexes = sort { $unsorted[$b] <=> $unsorted[$a] } 0..$#unsorted;
可以使用切片来获取排序值。
my @sorted_values = @unsorted[ @sorted_indexes ];
这是我的解决方案:
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