C:堆排序算法,delete&;插入
所以我要为类编写一个堆数据结构,它应该只使用插入和删除操作来实现堆排序 它起作用了。。对于较小的整数集(大小为10及以下)。 但是,当我在中输入一大组数字(100+)时,结果只是半排序的 以下是我的插入方法: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
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;