Commit 88d0fdf

mo khan <mo@mokhan.ca>
2013-07-11 03:44:24
implement merge sort
1 parent 2a1426c
lib/merge_sort.rb
@@ -0,0 +1,28 @@
+class MergeSort
+  def sort(items)
+    return items if items.size <= 1
+
+    if items.size % 2 == 0
+      pivot = items.size/2
+    else
+      pivot = (items.size/2) + 1
+    end
+
+    split = items.each_slice(pivot).to_a
+    merge(sort(split[0]), sort(split[1]))
+  end
+
+  private
+
+  def merge(left, right)
+    result = []
+    while left.size > 0 && right.size > 0 do
+      if left[0] < right[0]
+        result << left.shift
+      else
+        result << right.shift
+      end
+    end
+    result + left + right
+  end
+end
spec/merge_sort_spec.rb
@@ -0,0 +1,20 @@
+require "spec_helper"
+
+describe MergeSort do
+  let(:sut) { MergeSort.new }
+
+  it "should sort an empty array" do
+    sut.sort([]).should == []
+  end
+
+  it "should sort an array with one item" do
+    sut.sort([2]).should == [2]
+  end
+
+  it "should sort an array of numbers" do
+    n = 600
+    numbers = Array.new(n) { rand(n) }
+    sorted_numbers = numbers.sort
+    sut.sort(numbers).should == sorted_numbers
+  end
+end
spec/spec_helper.rb
@@ -2,3 +2,4 @@ require 'benchmark'
 require_relative '../lib/bubble_sort'
 require_relative '../lib/insertion_sort'
 require_relative '../lib/quick_sort'
+require_relative '../lib/merge_sort'