# sort.rb
class Array
def insertion
(1..self.count).each do |i|
(i..0).each do |j|
first = j - 1
second = j
if self[second] > self[first]
swap(second, first)
end
end
end
self
end
def mergesort
return self if self.size <= 1
mid = self.size/2
left = self[0, mid]
right = self[mid, self.size-mid]
merge_array(left.mergesort, right.mergesort)
end
# helpers
def merge_array(left, right)
sorted = []
until left.empty? or right.empty?
if left.first <= right.first
sorted << left.shift
else
sorted << right.shift
end
end
sorted.concat(left).concat(right)
end
def swap(previous, current)
copy = self[previous]
self[previous] = self[current]
self[current] = copy
end
end
我的RSpec的文件:爲什麼我的插入排序比mergesort更快?
require './sort'
unsorted = 5000.downto(1).to_a.shuffle
describe Array, "#insertion" do
it "sorts using insertion sort" do
time = Time.now
unsorted.insertion.should eq(unsorted.sort)
puts "insertion"
puts Time.now - time
end
end
describe Array, "#merge" do
it "sorts using merge sort" do
time = Time.now
unsorted.mergesort.should eq(unsorted.sort)
puts "merge"
puts Time.now - time
end
end
我們知道,插入排序應該比歸併排序慢,因爲插入排序的運行時間平均爲O(n^2),而合併排序是O(n * log(n))。但是,當我運行上面的測試代碼時,合併比插入慢10倍以上。
insertion 0.001294 seconds .merge 0.017322 seconds
我的猜測是,我使用一些昂貴的計算方法,如shift
和concat
,但具有相差10倍是太過分了。
如何改進合併排序?
這可能更適合http://codereview.stackexchange.com。查看[常見問題](http://codereview.stackexchange.com/faq),看看您的想法。 – 2013-03-08 01:07:36
謝謝你的建議。我認爲這是一個公平的建議。你能移動這個問題嗎?我不知道。 – 2013-03-08 01:08:51
我對它進行了標記,並要求版主對此進行了審查。這是該網站的一個很好的問題。祝你好運! – 2013-03-08 01:10:11