堆排:
1、建堆:判断是否两个孩子,比较两个孩子大小,大的孩子和父结点交换,之后判断子结点是否还有孩子,如果没有,重新回到父结点。
2、排序:从中间结点开始,依次递减至第一个,之后把顶部的数字拿出来。
用二叉树实现堆有什么好处?
1、没有空间浪费
2、没有扩容代价
void CreateHeap(int a[],int root,int len)
{
int i,t = a[root];
i = 2 * root;
while(i <= len)
{
if(i < len)
{
if(a[i] < a[i + 1])
i++;
}
if(t >= a[i])
break;
else
{
a[i / 2] = a[i];
i = 2 * i;
}
}
a[i / 2] = t;
}
void Sort(int a[],int len)
{
int i,t;
for(i = len / 2;i >= 1;--i)
{
CreateHeap(a,i,len);
}
for(i = len;i >= 1;--i)
{
t = a[1];
a[1] = a[i];
a[i] = t;
CreateHeap(a,1,i - 1);
}
}