Heapsort实现只是几乎排序数组

时间:2014-05-07 09:28:55

标签: ruby algorithm sorting

我一直在尝试在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]

1 个答案:

答案 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;数组中的任何内容,您只需重新排列元素。