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

来源:互联网 发布:淘宝文具海报1950px 编辑:程序博客网 时间:2024/06/03 17:49

堆其实是利用完全二叉树的结构来维护一组数据,然后进行相关操作,一般的操作进行一次的时间复杂度在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();            }        }