这个算法有什么问题吗?

时间:2010-07-14 15:27:17

标签: algorithm heap

我的Heap-Sort

算法存在问题
Heap_Sort(A)
  Build_Heap(A)
  for i<--n down to 2
    swap (A[1],A[n])
    n<--n-1
    MaxHeapify(A,1)

我认为我们不应该写这个算法:

Heap_Sort(A)
  Build_Heap(A)
  for i<-- n down to 1
    Delete_Max(A)

2 个答案:

答案 0 :(得分:1)

如果您正在进行就地排序......

Heap_Sort(A)
    B = Build_Heap(A)    # Assuming maxheap

    for i -> A.length to 0:
        Remove top value from B (which is basically just A, but treated differently),
        assuming the heap is modified to maintain partial ordering during this part
        (as well as decreasing the noted size of the heap by 1) and add the removed
        value to position A[i].

基本上是你的算法。但是,如果您没有进行此类排序,则只需使用minheap并将所有值弹出到新数组中。

答案 1 :(得分:0)

如果将max元素移动到堆数组的后面然后将其删除,则在完成时不会在数组中留下任何内容。因此,删除max的算法不会产生原始元素的排序数组。

根据OP编辑进行更新:

你可以这样做。但是,第一种方法允许您进行排序。您的方法需要额外存储O(N)。

另一个编辑:

很难确切地看到你在第一个算法上做出了什么假设,但是当我想到我在下面做出的评论时,似乎MaxHeapify(A,1)可能应该是MaxHeapify(A, n)。您通常会传递一个数组及其大小,或者在这种情况下,传递要作为堆排列的元素数。如果你假设n是一个全局变量,这可能没有实际意义。