From: Todd Benson Date: 2008-11-28T08:22:35+09:00 Subject: Re: Programming Noob Chris Pine Tutorial sorting without use of array.sort method On Thu, Nov 27, 2008 at 3:30 PM, whisperjim wrote: > I'm working through the following tutorial http://pine.fm/LearnToProgram/ > (recommended by the official Ruby site) > as a starting point and I've got to chapter 7 and struggling with the > following assignment........ > > " Let's write a program which asks us to type in as many words as we > want (one word per line, continuing until we just press Enter on an > empty line), and which then repeats the words back to us in > alphabetical order. OK? " > > Now I'm supposed to do this without any .sort method and the chapters > I've covered so far (1 ~ 7) have not covered method creation, > Classes,Blocks or Procs, so the challenge is to solve the assignment > without using them. > > Now I've written a program but I think the basic 'mental model' is > flawed, I say this because of the results I'm getting. > > If I use the following input [ q w e r t y ] I end up with [ e q r t w > w ] and the input [ z x c v b ] end up as [ b b b b b ]. > > If my mental model is o.k, then my code must be wrong, but I'm stumped > at to where. > > # concept - store words in 1st array (words_array). Find the > 'smallest' word alphabetically by selecting the last word (call it > wordCheck) and compare with the first word, second word and so on..... > and exchange the value of wordCheck with the other word (1st/2nd... > word) if the other word value happens to be less. Start the checking > again with the first word, second word.... and so on until a counter > has been reached (counter equal to current length of first unsorted > array). Once the counter has been reached, put the value of wordCheck > into a second array (sortedWords_array) and delete wordCheck value > from first unsorted array (words_array) and repeat until words_array > is empty. > > > puts 'Type in as many words as you want and once you\'ve had enough, > just \'enter\' a clear line.' > > words_array = [] # create 1st array called words_array to store users > unsorted values > > loop do > input = gets.downcase.chomp # take the user input, remove the > 'enter' off the tail and lower the case and call ... > break if input.empty? # .. it 'input' , break from the loop if > 'input' is equal to empty > words_array << input # push 'input' to the words_array > > end > > wordCheck = words_array.last # wordCheck is equal to the last 'input' > stored in the words_array > rotateCounter = 0 > sortedWords_array = [] # create 2nd array to contain 'sorted' values > > until words_array.length == 0 # exit once no words left in the first > unsorted array > > while rotateCounter <= words_array.length # exit if rotate counter > greater than words contained within first array > if words_array[0] >= wordCheck # continue if first word in 1st array > greater or equal to wordCheck value > > words_array.push words_array.shift # rotate the first unsorted > array > rotateCounter = rotateCounter + 1 # add 1 to counter > > else wordCheck = words_array[0] # replace current value (wordCheck) > with 'smaller' word > rotateCounter = 0 # reset counter to zero > end > > end > > sortedWords_array.push wordCheck # add wordCheck value to 2nd array > > until wordCheck = words_array.last # rotate first array until a > matching .. > words_array.push words_array.shift # .. value found at the back of > the first array > end > words_array.pop # remove the last value contained within the 1st > array > rotateCounter = 0 # reset rotate counter > wordCheck = words_array.last # replace current value of wordCheck > with new last word from 1st array > end > puts sortedWords_array # print values within 2nd array, which should > be in low to high alphabetical order > > Guidance greatly appreciated. Cheating... a = my_word_array sorted = [] while !a.empty?; sorted << a.delete(a.min); end Todd