您的位置:首页 > 其它

算法分析:堆排序

2017-01-11 14:38 176 查看
基本原理就是构建一个堆,然后删除根。

为了不用一个新的堆,把抽取出来的数据,放在堆末尾。

所以,要实现一个升序排序,就要构建一个最大堆,不停抽取最大数,放到末尾处。

//----------------堆排序--------------------
template<typename Comparable>
void heapsort(Vector<Comparable>& a)
{
//构建堆,从二分一后的点都是在最底层的,所以往回执行下滤,一路向上,构建一个最大堆
for (int i = a.size() / 2; i >= 0; i--)
{
percDown(a, i, a.size());
}

for (int j = a.size() - 1; j > 0; j--)
{
//交换头尾,得出最大的值在队尾,堆减少,
Comparable temp = a[0];
a[0] = a[j];
a[j] = temp;
//破坏了堆结构,执行下滤
percDown(a, 0, j);
}
}
int leftChild(int i)
{
return 2 * i + 1;
}
template<typename Comparable>
void percDown(Vector<Comparable>& a, int i, int n)
{
int child;
Comparable tmp = a[i];//当前需要下滤的实体
for ( ; leftChild(i) < n; i = child)
{
child = leftChild(i);//左边的儿子
if (child != n -1 && a[child] < a[child + 1])
{
child++;//左边的儿子比右边的儿子小,这是找大的一个
}
if (tmp < a[child])//比儿子小
{
a[i] = a[child];
}
else
{
break;
}
}
a[i] = tmp;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 堆排序