• a simple Heap implementation~


    Heap seems  sophisticated but the implementation is not very difficult. i think it is attrtibuted to its linear structure~

    Besides, heap is very useful~

    1 // Heap.cpp : 定义控制台应用程序的入口点。
    2  //
    3  
    4 #include "stdafx.h"
    5 #include <iostream>
    6 #include <vector>
    7 #include <stack>
    8 #include <math.h>
    9 using namespace std;
    10
    11 inline int LeftChild ( int father )
    12 {
    13 return (father+1)*2-1;
    14 }
    15
    16 inline int RightChild ( int father )
    17 {
    18 return (father+1)*2;
    19 }
    20
    21 inline int Father ( int child )
    22 {
    23 return (child-1)/2;
    24 }
    25
    26 void swap ( int &a , int &b )
    27 {
    28 a = a+b;
    29 b = a-b;
    30 a = a-b;
    31 }
    32
    33
    34 class Heap
    35 {
    36 public:
    37 Heap(){};
    38 Heap( vector <int> v ) : element ( v )
    39 {
    40 for ( int i = Father( element.size()-1 ) ; i >= 0 ; i-- )
    41 {
    42 PercolateDown ( i );
    43 }
    44 }
    45 ~Heap(){};
    46
    47 void PercolateDown ( int i )
    48 {
    49 while ( LeftChild ( i ) < ( int )element.size() && i>=0 )
    50 {
    51 int smallest = i;
    52 if ( element [ LeftChild ( i ) ] < element [ smallest ] )
    53 {
    54 smallest = LeftChild ( i );
    55 }
    56
    57 if ( RightChild ( i ) < ( int )element.size() )
    58 {
    59 if( element [ RightChild ( i ) ] < element [ smallest ] )
    60 {
    61 smallest = RightChild ( i );
    62 }
    63 }
    64 if ( smallest != i)
    65 {
    66 swap ( element [ i ] , element [ smallest ] );
    67 i = smallest;
    68 }
    69 else
    70 break;
    71 }
    72 }
    73
    74 vector < int > element;
    75
    76 void Insert ( int n )
    77 {
    78 element.push_back ( n );
    79 for ( int i = element.size()-1 ; element [ Father ( i ) ] > n ; i = Father ( i ) )
    80 {
    81 swap ( element [ i ] , element [ Father ( i ) ] );
    82 }
    83 }
    84 int DeleteMin ()
    85 {
    86 int min = 0;
    87 if ( !element.empty() )
    88 {
    89 min = element [ 0 ];
    90 element [ 0 ] = element [ element.size()-1 ];
    91 int SmallerChild = 0;
    92
    93 element.pop_back();
    94
    95 for ( int i = 0 ; LeftChild ( i ) < (int)element.size() ; i = SmallerChild)
    96 {
    97 SmallerChild = LeftChild ( i );
    98 if( RightChild ( i ) < (int)element.size() )
    99 {
    100 if ( element [ LeftChild ( i ) ] > element [ RightChild ( i ) ] )
    101 {
    102 SmallerChild = RightChild ( i );
    103 }
    104 }
    105
    106 if ( element [ i ] > element [ SmallerChild ] )
    107 {
    108 swap ( element [ i ] , element [ SmallerChild ] );
    109 }
    110 else
    111 break;
    112 }
    113 }
    114 return min;
    115 }
    116
    117 void Print ()
    118 {
    119 if ( element.size() != 0 )
    120 {
    121 stack < int > toprint;
    122 toprint.push( 0 );
    123 int maxdepth = ( int )( log ( ( double )element.size() ) / log ( ( double )2 ) );
    124
    125 vector < int > childrennum ( maxdepth + 1 , 0 );
    126 childrennum [ 0 ] = 1;
    127 while ( !toprint.empty() )
    128 {
    129 int tmp = toprint.top();
    130 int depth = ( int )( log ( ( double )( tmp + 1 ) ) / log ( (double)2 ) );
    131 toprint.pop();
    132
    133 for ( int i = 1 ; i <= 2*depth ; i++ )
    134 {
    135 if ( ( i/2 )*2 == i )
    136 {
    137 if ( childrennum [ ( i/2 ) ] > 0 )
    138 {
    139 cout << '|';
    140 }
    141 else
    142 {
    143 cout << ' ';
    144 }
    145 }
    146 else
    147 {
    148 cout << ' ';
    149 }
    150 }
    151 cout << '_' << element [ tmp ] << endl;
    152 childrennum [ depth ] --;
    153
    154 if ( LeftChild ( tmp ) < ( int )element.size() )
    155 {
    156 childrennum [ depth+1 ]++;
    157 toprint.push ( LeftChild ( tmp ) );
    158 }
    159 if ( RightChild ( tmp ) < ( int )element.size() )
    160 {
    161 childrennum [ depth+1 ]++;
    162 toprint.push ( RightChild ( tmp ) );
    163 }
    164 }
    165 }
    166 }
    167 };
    168
    169
    170
    171
    172
    173 int _tmain(int argc, _TCHAR* argv[])
    174 {
    175
    176 vector < int > initial;
    177 for ( int i = 0 ; i < 10 ; i ++ )
    178 {
    179 initial.push_back( rand()%100 );
    180 }
    181 Heap p ( initial );
    182 for ( int i = 0 ; i < 10 ; i ++ )
    183 {
    184 p.Print();
    185 p.DeleteMin();
    186 getchar ();
    187 }
    188
    189 return 0;
    190 }
    191
    192
  • 相关阅读:
    狼文化的一点思考
    数据可视化之风向图
    谈谈JavaScript代码混淆
    比尔盖茨2016好书推荐
    Cesium原理篇:glTF
    个人 产品 团队(下):个人与团队
    技术 产品 团队(上):如何成为超级个体
    惊艳的HTML5动画特效及源码
    精心挑选的HTML5/CSS3应用及源码
    炫酷霸气的HTML5/jQuery应用及源码
  • 原文地址:https://www.cnblogs.com/kking/p/1848277.html
Copyright © 2020-2023  润新知