我已经使用Max-Heap逻辑为Heap Sort编写了以下代码。
#include<bits/stdc++.h>
#include<algorithm>
#include<vector>
using namespace std;
void max_heapify(vector<int> &a,int i)
{
int left=2*i+1;
int right=2*i+2;
if(i >= (int)a.size()/2 )
{
return;
}
int max=i;
if(a[i]<a[left])
{
max=left;
}
if(a[max]<a[right])
{
max=right;
}
if(max!=i)
{
swap(a[i],a[max]);
max_heapify(a,max);
}
}
void build_maxHeap(vector<int> &a)
{
int l=a.size();
for(int i=l/2-1;i>=0;i--)
{
max_heapify(a,i);
}
}
void heap_sort(vector<int> &a)
{
build_maxHeap(a); // max element at top.
for(int i=a.size()-1;i>=1;i--)
{
swap(a[i],a[0]);
cout<<a[i]<<" ";
a.pop_back();
max_heapify(a,0);
}
cout<<a[0]<<endl;
}
int main()
{
vector<int> a={6,7,8,1,2,9,32};
heap_sort(a);
return 0;
}
输出:32 9 32 7 32 32
预期输出:按降序打印元素。
我不知道为什么会重复32次。我从最后弹出元素,但无法弄清楚为什么会这样做。
答案 0 :(得分:1)
您的max_heapify
中存在错误。
void max_heapify(vector<int> &a,int i)
{
int left=2*i+1;
int right=2*i+2;
if(i >= (int)a.size()/2 )
{
return;
}
int max=i;
if(a[i]<a[left])
{
max=left;
}
// Bug is here
if(a[max]<a[right])
{
max=right;
}
if(max!=i)
{
swap(a[i],a[max]);
max_heapify(a,max);
}
}
即使a[max] < a[right]
,您也始终会检查right >= size
。所以你可以遇到这种情况:
size = 2
i = 0
left = 1
right = 2
数组包含:[0,1,3, ...]
因为您没有检查是否right >= size
,&#39; 3&#39;将被重新插入你的堆中。