我读了几篇文章说,在堆中,只能删除根元素。但是,为什么我们不能使用以下方法删除元素?
- 找到要删除的关键元素的索引
- 把这个元素和最后一个元素交换,这样key就变成了最后一个元素
- 从键的原始索引开始重新堆化(您现在已与最后一个元素交换)
- 将堆大小减少 1
所以,代码看起来像
static void delete(int[] a, int key)
{
int i = 0;
for(i = 0;i<a.length;i++)
{
if(a[i] == key)
break;
}
swap(a, i, a.length-1);
max_heapify_forheapsort(a, i, a.length-2);
}
static void max_heapify_forheapsort(int[] a, int i, int limit)
{
int left = (2*i)+1;
int right = (2*i) + 2;
int next = i;
if(left <= limit && a[left] > a[i])
next = left;
if(right <= limit && a[right] > a[next] )
next = right;
if(next!=i)
{
swap(a, next, i);
max_heapify_forheapsort(a, next, limit);
}
}