堆排序是一个不稳定排序但是其最好最坏的时间复杂度为nlogn。
所谓的堆其实就是一个完全二叉树的结构其主要特点是所有的子树中父节点一定大于子节点。
堆排的主要思想是将序列构造成一个大顶堆,堆顶一定是整个序列中最大值然后将最大值与最后一个数值交换,之后又将剩下的n-1个元素构造成一个大顶堆之后在依次向与之前的数值进行操作。其主要代码实现如下:
void heapify(int tree[],int n,int i)
{ if(i>=n)return;
int c1=i*2+1;int c2=i*2+2; //分配代表其左右两个儿子的标号
int mx=i; if(tree[c1]>tree[mx])mx=c1;
if(tree[c2]>tree[mx])mx=c2;
if(mx!=i)
{
swap(tree[mx],tree[i]);
}
}
void build_heap(int tree[],int n)
{
int last_noda=n-1;
int fu=(last_node-1)/2;
for(int i=fu;i>=0;i--)
{
heapify(tree,n,i);
}
}
void sort_heap(int tree[],int n)
{
build(tree,n);
for(int i=n-1;i>=0;i--)
{
swap(tree[i],tree[0]);
heapify(tree,i,0);
}
}