From: Josh Cheek Date: 2011-12-09T12:23:53+09:00 Subject: Re: What is a good ruby tutorial / book for a beginner? --0015174be49e57780f04b3a0504c Content-Type: text/plain; charset=ISO-8859-1 On Thu, Dec 8, 2011 at 8:10 PM, Samuel Mensah wrote: > I have been reading Chris Pine's book for a while now and I'm stuck at > the chapter where I have to write my own sorting method. All the code I > tried don't work and when I searched for sorting algorithms and programs > in ruby, ALL the source code I had a look at had a couple of elements in > it that the book I'm reading hasn't taught yet...I think something is > missing... You guys are masters of this language and have already learnt > it so I'd want to know how you learnt it and what books you read and if > they are downloadable.Downloadable ebooks would be of great help to me, > thank you. :) > > -- > Posted via http://www.ruby-forum.com/. > > Hi, Sam :) This is a good exercise! When I first tried to sort an array, it hurt my brain (literally, it was physically painful) I had to look at a solution and draw it out on paper to be able to understand it. So don't sweat it, just realize you have to be dedicated :) Now, when you're starting out, you'll have to deal with people using things you haven't learned about yet. That's unfortunate, but it's a just a fact. Don't be put off by them, try to understand what they're doing, even if you don't understand how they're doing it. You'll learn the how in time, and the ability to understand the "what" without the "how" will be very powerful. Now, in the case of hashes, they're just just a collection, like arrays, but the difference is that you access them by some arbitrary object (called a key, usually a symbol or a string), rather than an integer index. I advocate playing around with some cards, pay attention to yourself when you sort them. What do you do? Can you articulate those steps so that if you described it to a human, they could understand them? Can you then take those steps and write them in code so that a machine can understand them? Anyway, here is one I just wrote. I try to use very few array methods, and whenever I think something might be confusing (ie "why is he doing that?") I pull it out and make it into a method whose name explains why I'm doing it. So if you read from the bottom, the implementation should be pretty obvious "for each element, insert it in sorted order into a new array" That's pretty straightforward :) Of course, now we have to figure out what "insert it in sorted order" means, so go up to the next method, see if you can understand how it works. If you understand each of the pieces, you understand the whole. You can also feel free to pull out the method calls and inline them if you think that will be more helpful for you. def can_access?(array, index) index < array.size end def make_a_hole(array, hole_index) current_index = array.size while hole_index < current_index array[current_index] = array[current_index-1] current_index -= 1 end end def insert(array, add_index, to_add) make_a_hole(array, add_index) array[add_index] = to_add end def ordered_insert(sorted_array, to_add) add_index = 0 while can_access?(sorted_array, add_index) && sorted_array[add_index] < to_add add_index += 1 end insert sorted_array, add_index, to_add end def sort(array) sorted = [] array.each do |to_add| ordered_insert sorted, to_add end sorted end a = [1, 4, 2, 5, 3] sort a # => [1, 2, 3, 4, 5] a # => [1, 4, 2, 5, 3] --0015174be49e57780f04b3a0504c--