#pragma once
#include <vector>

// 小堆
template<class T>  //仿函数
struct Less
{
       bool operator() (const T& l, const T& r)
       {
             return l < r; // operator<
       }
};

template<class T>
struct Greater
{
       bool operator() (const T& l, const T& r)
      {
           return l > r; // operator<
      }
};

template<class T, class Compare = Less<T>>
class Heap
{
public:
       Heap()
       {}

Heap(const T* a, size_t size)
      {
             for (size_t i = 0; i < size; ++i)
             {
                  _arrays.push_back(a[i]);
             }

// 建堆
             for(int i = (_arrays.size()-2)/2; i >= 0; --i)
            {
                  AdjustDown(i);
            }
      }

void Push(const T& x)
{
       _arrays.push_back(x);
      AdjustUp(_arrays.size()-1);
}

void Pop()
{
      assert(_arrays.size() > 0);
      swap(_arrays[0], _arrays[_arrays.size() - 1]);
      _arrays.pop_back();

AdjustDown(0);
}

T& Top()
{
       assert(_arrays.size() > 0);
       return _arrays[0];
}

bool Empty()
{
       return _arrays.empty();
}

size_t Size()
{
      return _arrays.size();
}

void AdjustDown(int root)
{
      int child = root*2 + 1;
//
      Compare com;
      while (child < _arrays.size())
     {
            // 比较出左右孩子中小的那个
           //if (child+1<_arrays.size() &&
           // _arrays[child+1] > _arrays[child])
           if(child+1<_arrays.size() &&
           com(_arrays[child+1],_arrays[child]))
          {
                ++child;
          }

//if(_arrays[child] > _arrays[root])
          if(com(_arrays[child],_arrays[root]))
         {
                swap(_arrays[child], _arrays[root]);
                root = child;
               child = 2*root+1;
         }
         else
        {
              break;
        }
    }
}

void AdjustUp(int child)
{
        int parent = (child-1)/2;

//while (parent >= 0)
        while (child > 0)
       {
              //if (_arrays[child] > _arrays[parent])
               if (Compare()(_arrays[child],_arrays[parent]))
               {
                      swap(_arrays[parent], _arrays[child]);
                      child = parent;
                      parent = (child-1)/2;
               }
               else
              {
                     break;
              }
       }
}

void Print()
{
       for (size_t i = 0; i < _arrays.size(); ++i)
      {
           cout<<_arrays[i]<<" ";
      }
      cout<<endl;
}

public:
/*T* _array;
size_t _size;
size_t _capacity;*/
vector<T> _arrays;
};

template<class T>
class PriorityQueue    //优先级队列
{
public:
      void Push(const T& x)
     {
           _hp.Push(x);
     }

void Pop()
    {
          _hp.Pop();
    }

public:
     Heap<T> _hp;
};

void Test1()
{
        int a[10] = {10, 11, 13, 12, 16, 18, 15, 17, 14, 19};
        Heap<int, Greater<int> > hp1(a, 10);
        hp1.Push(1);
        hp1.Print();

Heap<int> hp2(a, 10);
        hp2.Push(1);
        hp2.Print();

//Less<int> less;
//cout<<less(1, 2)<<endl;

//Greater<int> greater;
//cout<<greater(1, 2)<<endl;
}

#include <list>

void Test2()
{
       vector<int> v1;
       v1.push_back(1);
       v1.push_back(2);
       v1.push_back(3);
       v1.push_back(4);

// [)
      vector<int>::iterator it = v1.begin();//迭代器
      while (it != v1.end())
      {
            cout<<*it<<" ";
            ++it;
      }
     cout<<endl;

list<int> l1;
      l1.push_back(1);
      l1.push_back(2);
      l1.push_back(3);
      l1.push_back(4);

list<int>::iterator listIt = l1.begin();
      while (listIt != l1.end())
     {
           cout<<*listIt<<" ";
          ++listIt;
     }

cout<<endl;
}

堆Heap的更多相关文章

  1. JVM的堆(heap)、栈(stack)和方法区(method)

    JVM主要由类加载器子系统.运行时数据区(内存空间).执行引擎以及与本地方法接口等组成.其中运行时数据区又由方法区Method Area.堆Heap.Java stack.PC寄存器.本地方法栈组成. ...

  2. [转]JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )

    这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有比较大的帮助.废话不想讲了.入主题: 先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(h ...

  3. 堆heap和栈Stack(百科)

    堆heap和栈Stack 在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈 ...

  4. (转)Java里的堆(heap)栈(stack)和方法区(method)(精华帖,多读读)

    [color=red][/color]<一> 基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收.   引用数据类型,需要用new来创建,既在栈 ...

  5. Java中堆(heap)和栈(stack)的区别

    简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分 ...

  6. 优先队列Priority Queue和堆Heap

    对COMP20003中的Priority queue部分进行总结.图片来自于COMP20003 queue队列,顾名思义特点先进先出 priority queue优先队列,出来的顺序按照优先级prio ...

  7. python数据结构之堆(heap)

    本篇学习内容为堆的性质.python实现插入与删除操作.堆复杂度表.python内置方法生成堆. 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下 ...

  8. 纸上谈兵: 堆 (heap)

    纸上谈兵: 堆 (heap)   作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 堆(heap)又被为优先队列(priority ...

  9. JVM 内存初学 堆(heap)、栈(stack)和方法区(method)

    这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有比较大的帮助.废话不想讲了.入主题:先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(he ...

  10. 转:JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )

    原文地址:JVM 内存初学 (堆(heap).栈(stack)和方法区(method) ) 博主推荐 深入浅出JVM 这本书 先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(heap).栈( ...

随机推荐

  1. CSS 的overflow:hidden 属性详细解释

    overflow:hidden这个CSS样式是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出, 而对于清除浮动这个含义不是很了解.一提到清除浮动,我们就会想到另外一个CSS样式 ...

  2. js中的call与apply

    看js权威指南里面关于call与apply方法的说明:我们可以将call()与apply()看作是某个对象的方法,通过调用方法的形式来间接调用函数.这样的解释未免使人糊涂啊.下面说一下自己的见解:其实 ...

  3. 【pku2115-C Looooops】拓展欧几里得-不定方程

    http://poj.org/problem?id=2115 题解:一个变量从A开始加到B,每次加C并mod2^k,问加多少次.转化为不定方程:C*x+2^K*Y=B-A //poj2115 #inc ...

  4. lintcode:颜色分类

    颜色分类 给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红.白.蓝的顺序进行排序. 我们可以使用整数 0,1 和 2 分别代表红,白,蓝. 样例 给你数组  ...

  5. Github 学习

    1.git$cd ~/hello-world.$git add . //这样可以自动判断新加了哪些文件,或者手动加入文件名字$git commit //提交到本地仓库,不加参数会提示,注意:^=Ctr ...

  6. How to configure Spring facet in IntelliJ IDEA

    遇到了这个问题,稀里糊涂的就给搞定了,在stackoverfolw上看到了相同的问题,直接拷贝下来吧 Spring Configuration Check Unmapped Spring config ...

  7. swift:入门知识之简单值

    1.swift中用let关键字类定义常量,用var关键字来定义变量. 2.swift语句的结尾不需要再带逗号,系统在运行程序时自动会帮你添加上 3.一个变量或常量必须与赋值时拥有相同的类型. 4.如果 ...

  8. Oracle ->> 查看分区表的每个分区的数据行分布情况

    ora_hash函数用来返回分区号,而dbms_rowid.rowid_object()函数用来返回object_id , ) part_id ,count(*) from sales_fact_pa ...

  9. openfire插件开发入门1

    .案例插件的功能 这个插件很简单,就是在openfire Server启动时,和关闭时,在控制台打印出消息. 3.插件开发的目录结构设计 先来看一下当前openfire在eclipse中的目录结构: ...

  10. makefile中的自动化变量 【转】

    转自:http://blog.chinaunix.net/uid-28458801-id-3495215.html 自动化变量 模式规则中,规则的目标和依赖文件名代表了一类文件名:规则的命令是对所有这 ...