实现HeapSort - 无法按预期排序

时间:2014-06-07 08:45:27

标签: c++ heapsort

我已尝试使用调试器和单步执行大量调试,但有些人无法按升序对数组进行排序。

我已经实现了一个maxHeap,并希望按升序对数组进行排序。 这是我的完整代码,请告诉我我错在哪里。

#include <iostream>

struct maxHeap {
    int sizeOfHeap;
    int *array;
};

// Ptr to heap
maxHeap *heapPtr = new maxHeap();

//Functions
void heapSort(int *, int );
maxHeap *buildHeap(int *, int);
void heapify(maxHeap *, int);
void swap(int *, int *);

void heapSort(int *inputArray, int size) {

    heapPtr = buildHeap(inputArray,size);
        while ( heapPtr->sizeOfHeap > 0 ) {
                swap(&heapPtr->array[0],&heapPtr->array[size-1]);
                --(heapPtr->sizeOfHeap);

                                //Heapify the root
                  heapify(heapPtr,0);

        }

    }

    maxHeap *buildHeap(int *inputArray, int size) {

            heapPtr->array      = inputArray;
            heapPtr->sizeOfHeap = size;

            for(int i = (size-2)/2; i >= 0; i-- ) {
                heapify(heapPtr,i);
        }

        return heapPtr;

    }

    //Heapify procedure
    void heapify(maxHeap *theHeap, int index) {

        int root       = index;
        int leftChild  = (index << 1 ) + 1;
        int rightChild = (index << 1 ) + 2;

        if ( leftChild < theHeap->sizeOfHeap && theHeap->array[leftChild] > theHeap->array[root] )
                root = leftChild;

        if ( rightChild < theHeap->sizeOfHeap && theHeap->array[rightChild] > theHeap->array[root] )
                root = rightChild;

        if ( root != index ) {
                swap( &theHeap->array[root], &theHeap->array[index] );
                heapify(theHeap,root);

        }
    }

    void swap(int *numOne, int *numTwo) {
        int temp = *numTwo;
        *numTwo = *numOne;
        *numOne = temp;
    }



    Input - 12 11 13 5 6 7
    Expected Output - 5 6 7 11 12 13
    Output received - 13 11 7 5 6 12

1 个答案:

答案 0 :(得分:1)

请注意,代码是完整的:它缺少main()和结构maxHeap,即,即使重现问题也需要不必要的努力。代码显然没有任何调试指示,单步执行代码可能毫无意义。

找到问题的方法是在战略要点打印堆的内容。通过这种方式,您会看到1213奇怪地停留在堆顶部,指向堆大小的不一致使用。具体来说,您应该更改这两行

swap(&heapPtr->array[0],&heapPtr->array[size-1]);
--(heapPtr->sizeOfHeap);

成为

swap(&heapPtr->array[0], &heapPtr->array[--(heapPtr->sizeOfHeap)];

......或者,实际上:

std::swap(heapPtr->array[0], heapPtr->array[--(heapPtr->sizeOfHeap)];

...但是,它可能是一项家庭作业,你不能将标准库用于实际操作。否则,您可以使用std::priority_queue<int>std::make_heap()std::pop_heap()