Sorting

Is there some reason why this won’t work:

x.sort!

? If you’re not not familiar with the !-suffixed methods in Ruby, they mean
"do in place". So x.sort returns a sorted array leaving x unchanged, while
x.sort! Makes x into a sorted array.

So this
a = [8,4,6,2,5]
a.sort!

… sets a to [2,4,5,6,8]

Incidentally, Ruby also makes operations like swap() rather simple:

x, y = y, x

…is valid and does what you’d expect.

HTH,

Mike

···

-----Original Message-----
From: vanjac12@yahoo.com [mailto:vanjac12@yahoo.com]
Sent: 04 December 2003 08:42
To: ruby-talk@ruby-lang.org
Subject: sorting

I’m not sure where to post about this problem, so
please suggest appropriate places if you have suggestions.
(I always say this, thinking I will post it to some new newsgroup).

I am writing a practice program (in ruby–not improtant)
to sort an array of n arbitrary integers a[i] (i = 0, …, n-1), putting
them in increasing order. I want to rearrange the array a so that

a[0] <= a[1] <= … <= a[n-1]

The integers will have to be permuted by a member
of the permutation group on n objects S_n.

Any permutation p can be written as a product of
interchanges, so the basic subroutine (does the term
subroutine date me?) will be to swap 2 integers.

ruby has the following comparison; x <=> y

which returns - 1 if x < y
0 if x = y
+ 1 if x > y
for example,

3 <=> 1 # 3 > 1 so <=> returns 1
=> 1
3 <=> 3 # 3 == 3 so <=> returns 0
=> 0
3 <=> 5 # 3 < 5 so <=> returns -1
=> -1

Thus if we compared 2 elements of the array

a[i] <=> a[j]

and get + 1, we swap them. Otherwise, do nothing, as they are in order.

To swap two numbers x and y, call

swap(x,y)
z = x
x = y
y = z
end

If x = a[i] and y = a[j], this interchanges the 2 numbers.

I am thinking this thru as I go, and I am old and not as tireless or smart
as I used to be.

There is only so much I can do without getting feedback
from running an actual program to let me know where
I am going wrong.

Do you think this is a good start on the problem?

Any suggestions on what to do next?

I was thinking of something like this. (One thing about ruby, is that
without knowing the language, you can read the program). If we are going to
compare a[i] and a[j], we only want to consider i < j, to avoid doing
everything twice.

0.upto(n-2) |i|
ii = i+1
ii.upto(n-1) |j|
if ( x[i] <=> x[j] ) == 1
swap(x[i],x[j])
end
end
end

Do you think this will work?

For 2 numbers, i = 0, ii = 1 = j==> works
For 3 numbers, i = 0 ii = 1 = j
=> (a0,a1) ordered ==> new(a0,a1) = (b0,b1) then
then j = 2 => (b0,a2) ordered => (c0,c2).

I am already confused as to what this program would actually do. Perhaps
this is not the way to do it at all. I guess I will have to write it and try
it out. That’s often the way to things anyway.

Any suggestions for improvements are welcome.

I imagine that many people have had to do something like this during their
life, especially programmers. I am a physicist, but I’m surprised that I’ve
never seen a sort program–it seems so basic.

Van


This communication (including any attachments) contains confidential information. If you are not the intended recipient and you have received this communication in error, you should destroy it without copying, disclosing or otherwise using its contents. Please notify the sender immediately of the error.

Internet communications are not necessarily secure and may be intercepted or changed after they are sent. Abbey National Treasury Services plc does not accept liability for any loss you may suffer as a result of interception or any liability for such changes. If you wish to confirm the origin or content of this communication, please contact the sender by using an alternative means of communication.

This communication does not create or modify any contract and, unless otherwise stated, is not intended to be contractually binding.

Abbey National Treasury Services plc. Registered Office: Abbey National House, 2 Triton Square, Regents Place, London NW1 3AN. Registered in England under Company Registration Number: 2338548. Regulated by the Financial Services Authority (FSA).