我已尝试使用调试器和单步执行大量调试,但有些人无法按升序对数组进行排序。
我已经实现了一个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
答案 0 :(得分:1)
请注意,代码是完整的:它缺少main()
和结构maxHeap
,即,即使重现问题也需要不必要的努力。代码显然没有任何调试指示,单步执行代码可能毫无意义。
找到问题的方法是在战略要点打印堆的内容。通过这种方式,您会看到12
或13
奇怪地停留在堆顶部,指向堆大小的不一致使用。具体来说,您应该更改这两行
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()
。