laziness, impatience, and hubris PerlMonks

Re: Conditional Sorting

by jdporter (Canon)
 on May 11, 2007 at 05:31 UTC ( #614816=note: print w/replies, xml ) Need Help??

It appears that @arr are the nodes in a graph, and %hash are the weights of all the edges in the graph. (It's undirected, and fully connected.) So now you want to sort the nodes — but by what, exactly, is not clear. With the information given, I would surmise that the values for each node come from the weights of all its edges. If so, then the following:

```use strict; use warnings;
my @arr = ('foo','bar','qux','foo1','bar1','qux1');
my %hash =
(
'4-5' => '0.750',
'0-4' => '0.167',
'0-2' => '0.600',
'2-3' => '0.200',
'2-4' => '0.300',
'0-3' => '0.300',
'2-5' => '0.400',
'1-2' => '0.550',
'1-5' => '0.273',
'3-4' => '0.300',
'1-4' => '0.182',
'0-1' => '0.917',
'3-5' => '0.400',
'0-5' => '0.250',
'1-3' => '0.300'
);

my @nodew;
for ( keys %hash )
{
my \$v = \$hash{\$_};
\$nodew[\$_] += \$v for /(\d+)/g;
}

my @sorted_node_indices = sort {
\$nodew[\$a] <=> \$nodew[\$b]
} 0 .. \$#nodew;

my @arr_sorted = @arr[ @sorted_node_indices ];

Update: I see, you want, for each node, the list of its neighbor nodes sorted by edge weight.

```use strict; use warnings;
my @arr = ('foo','bar','qux','foo1','bar1','qux1');
my %hash =
(
'4-5' => '0.750',
'0-4' => '0.167',
'0-2' => '0.600',
'2-3' => '0.200',
'2-4' => '0.300',
'0-3' => '0.300',
'2-5' => '0.400',
'1-2' => '0.550',
'1-5' => '0.273',
'3-4' => '0.300',
'1-4' => '0.182',
'0-1' => '0.917',
'3-5' => '0.400',
'0-5' => '0.250',
'1-3' => '0.300'
);

my %edgew;

for ( keys %hash )
{
my( \$from, \$to ) = @arr[ /(\d+)/g ];
\$edgew{\$from}{\$to} =
\$edgew{\$to}{\$from} = \$hash{\$_};
}

for my \$from ( sort keys %edgew )
{
print "\$from:\n";
print "\t\$_ : \$edgew{\$from}{\$_}\n" for
sort { \$edgew{\$from}{\$a} <=> \$edgew{\$from}{\$b} }
keys %{ \$edgew{\$from} };
}
A word spoken in Mind will reach its own level, in the objective world, by its own weight

Create A New User
Node Status?
node history
Node Type: note [id://614816]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (4)
As of 2018-05-25 22:52 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
World peace can best be achieved by:

Results (191 votes). Check out past polls.

Notices?