我一直在尝试在Ruby中实现heapsort,但到目前为止,我的算法只能正确排序90%的数组,而不是其余的。任何人都可以看到出了什么问题吗?
这是我的代码
require 'pp'
def left(i)
(i+1)*2-1
end
def right(i)
(i+1)*2
end
def max_heapify(a, root)
left, right = left(root), right(root)
max = root
if left < a.length and a[left] > a[max]
max = left
end
if right < a.length and a[right] > a[max]
max = right
end
if max != root
a[root], a[max] = a[max], a[root]
max_heapify(a, max)
else
a
end
end
def build_max_heap(a)
((a.size-1)/2).downto(0) do |i|
max_heapify(a, i)
end
a
end
def heap_sort(a)
len = a.size
build_max_heap(a)
(len-1).downto(0) do |i|
a[0], a[i] = a[i], a[0]
a.delete_at(len)
max_heapify(a, 0)
end
a
end
a = (1..10).to_a.shuffle
pp heap_sort(a)
结果:[10, 9, 7, 8, 6, 2, 4, 5, 1, 3]
答案 0 :(得分:-1)
在排序过程中,当您将最大元素移动到最后时,不要再触摸它,它是 排序和要排序的数组(以及堆)应该在它之前结束。
你还需要一个max_heapify
的参数,告诉堆在哪里结束,它不是
数组的结尾。
require 'pp'
def left(i)
i*2+1
end
def right(i)
i*2+2
end
def max_heapify(a, root, len)
left, right = left(root), right(root)
max = root
if left < len and a[left] > a[max]
max = left
end
if right < len and a[right] > a[max]
max = right
end
if max != root
a[root], a[max] = a[max], a[root]
max_heapify(a, max, len)
else
a
end
end
def build_max_heap(a)
((a.size-1)/2).downto(0) do |i|
max_heapify(a, i, a.length)
end
a
end
def heap_sort(a)
len = a.size
build_max_heap(a)
(len-1).downto(0) do |i|
a[0], a[i] = a[i], a[0]
max_heapify(a, 0, i)
end
a
end
a = (1..10).to_a.shuffle
pp heap_sort(a)
PP。不确定delete_at
做了什么(不了解Ruby),但我强烈怀疑它不是
需要,在某种情况下,你不要删除&#34;数组中的任何内容,您只需重新排列元素。