堆排序
大根堆
大根堆的定义为一个完全二叉树,且任意一个节点的值都大于它的任意一个左右孩子的值.
大根堆代码实现
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <map>
#include <unordered_map>
using namespace std;
void adjustdown(vector<int>&ans, int i, int len)
{
while (true)
{
int maxIndex = 2*i+1;
if (maxIndex>len)
break;
if(maxIndex+1<=len&&ans[maxIndex]<ans[maxIndex+1])
maxIndex++;
if(ans[i]<ans[maxIndex])
{
swap(ans[i], ans[maxIndex]);
i = maxIndex;
}
else
break;
}
}
void adjustup(vector<int>&ans,int i)
{
while (true)
{
int parent =i%2?(i-1)/2:(i-2)/2;
if (parent<0||ans[parent]>=ans[i])
break;
swap(ans[parent], ans[i]);
i = parent;
if(i==0)
break;
}
}
void makeheap(vector<int>&ans, int len)
{
int i;
i = len%2?(len-1)/2:(len-2)/2;
for (; i>=0&&(2*i+1)<=len; --i)
{
adjustdown(ans, i,len);
}
}
void print(vector<int>ans)
{
for (int i=0; i<ans.size(); ++i)
{
cout<<ans[i]<<" ";
}
cout<<endl;
}
int main()
{
int a[]={1,2,3,19,5,28,7,-2,9,0};
vector<int> ans(a,a+(sizeof(a)/sizeof(int)));
int len = (int)ans.size()-1;
makeheap(ans,len);
while (len)
{
swap(ans[len], ans[0]);
adjustdown(ans, 0,--len);
}
print(ans);
makeheap(ans,(int)ans.size()-1);
print(ans);
ans.push_back(8);
adjustup(ans,(int)ans.size()-1);
print(ans);
return 0;
}
执行结果
-2 0 1 2 3 5 7 9 19 28
28 19 7 9 3 5 1 -2 2 0
28 19 7 9 8 5 1 -2 2 0 3