### Conditional Sorting

by monkfan (Curate)
 on May 11, 2007 at 05:06 UTC Need Help??
monkfan has asked for the wisdom of the Perl Monks concerning the following question:

Dear all,
Suppose I have the following array and hash:
```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'
};

Now the key and value of \$hash represent the following:
```    'x-y' => 'VALUE'

x and y represent the index of the element in @arr
x and y are reversible

so for example:

'0-3' => '0.300', means that
'foo' and 'foo1' has value 0.300 OR
'foo1' and 'foo' has value 0.300
Now my question is, how can we sort decendingly @arr_sorted, such that for every index 'z' in @arr, the VALUE of its (z,y) <= (z,y+1)?

Members of @arr_sorted is exactly the same as @arr, only sorted according to the condition above. And yes, every 'z' has its corresponding @arr_sorted.

I'm not sure how to proceed from here:
```
foreach my \$z (0 .. (\$#arr-1)) {

my @arr_sorted = sort{???} @arr;

}

Updated.

Regards,
Edward

Replies are listed 'Best First'.
Re: Conditional Sorting
by jdporter (Canon) on May 11, 2007 at 05:31 UTC

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
Re: Conditional Sorting
by Zaxo (Archbishop) on May 11, 2007 at 05:46 UTC

If, say, '4-5' => .001 with the rest unaltered, then the data is incompatible with the sort you want. That suggests that you want data validation, not sorting.

After Compline,
Zaxo

Re: Conditional Sorting
by jesuashok (Curate) on May 11, 2007 at 07:00 UTC
"sorting. very useful."

jesuashok, there are 17 documents at that address.  Which one(s) did you find useful?

Or do you just mean that any node called "sorting", which gives so many references, must be a good answer to a node called Conditional Sorting (Since they both have "sorting" in their titles)?

Going by that logic, wouldn't this be an even better link?  How about one with even more results?

Hopefully you can see my point here.  I've noticed recently that you tend to throw links at questions without giving much other context:

But have you considered that most of the Seekers of Perl Wisdom already know how to search for themselves?  They are not usually asking for a link to merely tangentially-related material, they are asking for specific advice, and experience directly applicable to their unique circumstances.

Please bear these things in mind, before rushing to do a search for the first similar-sounding hit that comes up.  As always, it's best if you have a firsthand knowledge of the problem at hand.  But when you don't, it may be better to exercise patience and restraint, and let more relevant posts prevail.

s''(q.S:\$/9=(T1';s;(..)(..);\$..=substr+crypt(\$1,\$2),2,3;eg;print\$..\$/

Create A New User
Node Status?
node history
Node Type: perlquestion [id://614814]
Approved by Zaxo
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (6)
As of 2018-04-20 20:34 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
My travels bear the most uncanny semblance to ...

Results (79 votes). Check out past polls.

Notices?