您的位置:首页 > 编程语言

堆中基本操作方法伪代码分析

2017-09-14 15:49 399 查看
堆其实是利用完全二叉树的结构来维护一组数据,然后进行相关操作,一般的操作进行一次的时间复杂度在O(1)~O(logn)之间。

堆的几个基本操作:
上浮 shift_up;
下沉 shift_down
插入 push
弹出 pop
取顶 top
堆排序 heap_sort

Shift_up( i )//i为当前节点
{
while( i / 2 >= 1)
{
if( 堆数组名[ i ] < 堆数组名[ i/2 ] )
{
swap( 堆数组名[ i ] , 堆数组名[ i/2 ]) ;
i = i / 2;
}
else break;
}

Shift_down( i , n )    //n表示当前有n个节点
{
while( i * 2 <= n)
{
T = i * 2 ;
if( T + 1 <= n && 堆数组名[ T + 1 ] < 堆数组名[ T ])
T++;
if( 堆数组名[ i ] < 堆数组名[ T ] )
{
swap( 堆数组名[ i ] , 堆数组名[ T ] );
i = T;
}
else break;
}
插入操作其实是每次插入的时候呢,我们都往最后一个插入,让后使它上浮。

Push ( x )
{
n++;
堆数组名[ n ] = x;
Shift_up( n );
}
弹出操作其实是弹出堆顶元素(将堆顶元素与堆最后一个元素交换,然后利用下沉操作来维护堆)
Pop ( x )
{
swap( 堆数组名[1] , 堆数组名[ n ] );
n--;
Shift_down( 1 );
}


取堆顶操作:根节点数组下标必定是1,返回堆[
1 ]就OK了~~注意:每次取顶要判断堆内是否有元素;
堆排序:

Heap_sort( a[] )
{
k=0;
while( size > 0 )
{
k++;
a[ k ] = top();
pop();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: