Commit b0ff6f9

mo khan <mo@mokhan.ca>
2013-07-11 23:03:18
shrink the merge sort
1 parent cd33f3b
Changed files (2)
lib
spec
lib/sorting/merge_sort.rb
@@ -2,22 +2,15 @@ class MergeSort
   def sort(items)
     return items if items.size <= 1
     pivot = items.size/2
-    pivot += 1 unless items.size % 2 == 0
-    split = items.each_slice(pivot).to_a
-    merge(sort(split[0]), sort(split[1]))
+    left, right = items[0...pivot], items[pivot...items.size]
+    merge(sort(left), sort(right))
   end
 
   private
 
   def merge(left, right)
     result = []
-    until left.empty? || right.empty? do
-      if (left.first <=> right.first) == -1
-        result << left.shift
-      else
-        result << right.shift
-      end
-    end
+    result << ((left.first <=> right.first) == -1 ? left.shift : right.shift) until left.empty? || right.empty?
     result + left + right
   end
 end
spec/sorting/merge_sort_spec.rb
@@ -12,11 +12,9 @@ describe MergeSort do
   end
 
   it "should sort an array of numbers" do
-    n = 600
+    n = 601
     numbers = Array.new(n) { rand(n) }
     sorted_numbers = numbers.sort
-    Benchmark.bmbm do |x|
-      x.report("merge sort") { sut.sort(numbers).should == sorted_numbers }
-    end
+    sut.sort(numbers).should == sorted_numbers
   end
 end