Commit 88d0fdf
Changed files (3)
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'