From: "Jesús Gabriel y Galán" Date: 2013-07-31T16:07:21+09:00 Subject: Re: Working through Ch.10 for learning to program 2.0 (Chris Pine) On Wed, Jul 31, 2013 at 5:00 AM, JD KF wrote: > So, I am just taking a detour away from the book for a bit and trying > something else and will go back to it. I glanced at the solution for > one you all wrote out. The book didn't really go over a lot of what you > all are doing. > > When I go back to the book, I'm going to attempt to do it without > recursion and then with recursion. However, I am really curious if > someone could give me a semi hint on how to do it without recursion > based off my card swap example. > > My guess is it would involve a while loop that does a swap something > like this: > > if a>b > X++ > Y++ > elsif a==b > check next letter and compare > else > swap a and b Let me explain a little bit what I did, expanding the one liner. I started with your description of the select sort algorithm: > So, here is how to do it with cards. Basically, you look at the first > card and compare it with the second. If its smaller, you compare it to > the next one, etc. etc. until you either find a smaller card or you > don't. If you do find a smaller card, you swap the cards. If you > don't, you leave them. > Then you move on to the second card and do the same thing. You do this > until you get to the last card (which should be the biggest at this > point). So, there's a loop from the first to the last. In each step of the loop I look for the smaller value from the remaining. I do it with min, but in your explanation you do it comparing each two elements. If the smallest is smaller than the value you are looking at, you swap them. Then you continue with the loop: p a.each_with_index {|e,i| (x = a[i..-1].find_index(a[i..-1].min)) && ((a[i],a[i+x]=a[i+x],a[i]) if a[i+x] <= e) } Expanding it: a.each_with_index do |current, i| # find the min from the rest of the array min = a[1..-1].min # this could be replaced by another loop over a[1..-1] with a temporary variable holding the smallest seen, and another with the index where that is min_index = a[1..-1].find_index(min) # the index relative to the rest of the array # if min is smaller than the one we are looking at (i) we swap them if min < e a[i],a[i+x]=a[i+x],a[i] end end # print it p a Hope this helps, Jesus.