C:堆排序算法,delete&;插入

C:堆排序算法,delete&;插入,c,arrays,heap,heapsort,C,Arrays,Heap,Heapsort,所以我要为类编写一个堆数据结构,它应该只使用插入和删除操作来实现堆排序 它起作用了。。对于较小的整数集(大小为10及以下)。 但是,当我在中输入一大组数字(100+)时,结果只是半排序的 以下是我的插入方法: void insert(heapHndl H, int priority) { // Makes sure heap has enough room for new element. assert(!isFull(H)); // Increase the c

所以我要为类编写一个堆数据结构,它应该只使用插入和删除操作来实现堆排序

它起作用了。。对于较小的整数集(大小为10及以下)。 但是,当我在中输入一大组数字(100+)时,结果只是半排序的

以下是我的插入方法:

 void insert(heapHndl H, int priority) {
     // Makes sure heap has enough room for new element.
     assert(!isFull(H));
     // Increase the current size.
     H->currentSize++;
     // Add to array.
     int pos = H->currentSize;
     // Work up.
     while (pos > 1 && priority < H->array[pos/2]) {
         swap (H, pos, pos/2);
         pos /= 2;
     }
     H->array[pos] = priority;
 }
我似乎无法找出delete方法缺少的其他情况。我很确定我的插入方法很好(手动检查)。谢谢你的帮助。
编辑:忽略名称deleteMax。它实际上是一个最小堆。Root是最小的整数。

下面两行肯定是个问题

     if (leftChild > H->currentSize || rightChild > H->currentSize)
         break;
如果其中一个子项丢失,则循环不允许中断,只有当两个子项都丢失时才允许中断。如果缺少右子项,则仍必须进行检查,并可能与左子项交换



编辑:另一方面,如果父节点是三个节点(父节点、左节点、右节点)中最小的一个,则循环确实需要中断。

我们可以查看
heapHndl
的详细信息吗<代码>整数根=1非常可疑。Int root=1,因为数组从1开始。这样,如果root=0,leftChild=2*root就不等于0。我看不出您在哪里为HeapStruct成员
int*数组分配内存但是我看到这样的语句:`H->array[pos/2])`和`H->array[pos/2])`您使用过malloc()或calloc()调用吗?如果是,您分配了多少内存?@ryker,tmp->array=malloc(sizeof(int)*(maxSize+1))@user3288944-在您的帖子的上下文中,没有
m(c)alloc()
语句。也没有
tmp->array
。这将有助于在上下文中看到它们。您可能会重新思考您是如何提出这个问题的,在自己进行一些调试之后,如果问题仍然存在,请重新发布。我解决了,但还是一样的问题。还有其他建议吗?谢谢可以进行一个while循环吗?或者我应该让它成为一个递归函数?@user3288944你完全可以用while循环来实现它。你能将修改后的代码附加到问题上吗?@user3288944我已经用另一个观察结果更新了答案。如果我的插入函数实现正确,父节点是否可能比其子节点小?更新:这解决了问题。所以我想父母可能比孩子小。
 typedef struct HeapStruct {
     int maxSize;
     int currentSize;
     int *array;
 } HeapStruct;

typedef HeapStruct* heapHndl;
     if (leftChild > H->currentSize || rightChild > H->currentSize)
         break;