堆结构与堆排序

#ifndef HEAP_H
#define HEAP_H
#include <iostream>
#include <vector>
using namespace std;

template <typename T>
class Heap
{
public:
    Heap(vector<T> &_vec) : vec(_vec){}
    ~Heap(){
        vec.~vector();
    }
    Heap(const Heap& rhs)
    {
        this->vec = rhs.vec;
    }
    Heap &operator =(const Heap&rhs)
    {
         if(this == &rhs) return *this;
         vec.clear();
         this->vec = rhs.vec;
         return *this;
    }
    void heapify(bool isMax,int index,int size)
    {
        int l = left(index);
        int r = right(index);
        int largest;
        if(isMax)
        {
            if(l < size && vec.at(l) > vec.at(index))
                largest = l;
            else largest = index;
            if(r < size && vec.at(r) > vec.at(largest))
                largest = r;
            if(largest != index)
            {
                std::swap(vec.at(index),vec.at(largest));
                heapify(true,largest,size);
            }
        }
        else
        {
            if(l < size && vec.at(l) < vec.at(index))
                largest = l;
            else largest = index;
            if(r < size && vec.at(r) < vec.at(largest))
                largest = r;
            if(largest != index)
            {
                std::swap(vec.at(index),vec.at(largest));
                heapify(false,largest,size);
            }
        }
    }
    void build_heapify(bool isMax,int size)
    {
        int _size = size;
        for(int i=_size/2;i>=0;i--)
                heapify(isMax,i,size);
    }
    void sort(bool isMax)
    {
        int size = vec.size()-1;
        build_heapify(isMax,size);
        for(int i=size;i>=0;i--)
        {
            std::swap(vec.at(0),vec.at(i));
            int _size = i;
            heapify(isMax,0,_size);
        }
    }
    friend ostream& operator <<(ostream &os,
                                const Heap<T> &heap)
    {
        for(int i=0;i<heap.vec.size();i++)
        {
            os << heap.vec.at(i) << ends;
        }
        os << endl;
        return os;
    }
    T &operator[](size_t n)
    {
        return vec[n];
    }
private:
    inline int left(int index)
    {
        return index*2+1;
    }
    inline int right(int index)
    {
        return index*2+2;
    }

    vector<T> &vec;
};

#endif // HEAP_H
时间: 2024-11-07 10:01:08

堆结构与堆排序的相关文章

八大基本排序---堆排序、堆结构

堆排序很重要,但是更重要的是堆这个结构 堆结构:实际上是一棵完全二叉树 一个数组可以根据父结点.左子结点.右子结点的关系,脑补出一棵完全二叉树 算法1:一个数组变为大顶堆 heapInsert() 数组:2.1.3.6.0.4 (1)只有2的时候 (2) 2.1[认为完全二叉树的范围是0~1的,超过1就越界] (3)2.1.3 3(下标2)找到自己的父结点:(2-1)/2=0 此时不满足大顶堆了,将2跟3交换 (4)2.1.3.6 6(下标3)找到它的父结点:(3-1)/2=1,发现6>1,将3

探秘堆结构

一.概述 此处所说的堆为数据结构中的堆,而非内存分区中的堆.堆通常可以被看做是树结构,满足两个性质:1)堆中任意节点的值总是不大于(不小于)其子节点的值:2)堆是一棵完全树.正是由于这样的性质,堆又被称为优先队列.根据性质一,将任意节点不大于其子节点的堆称为最小堆或最小优先队列,反之称为最大堆或最大优先队列.优先队列在操作系统作业调度的设计中有着举足轻重的作用.之前写了一篇优先队列的文章,详见算法导论第六章优先队列. 常见的堆结构,有二叉堆.左倾堆.斜堆.二项堆.斐波那契堆等.斐波那契堆在前文算

大顶堆第二弹----堆排序(递归实现)

1 package tooffer; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 6 public class BigHeap { 7 8 9 10 /* 11 *交换堆中的两个元素 12 */ 13 private void swap(ArrayList<Integer> heapList,int srcIndex,int dstIndex) 14 { 15 int tmp = heapList.get(srcIn

SDUT 堆结构练习——合并果子之哈夫曼树(丧心病狂heap)

树-堆结构练习--合并果子之哈夫曼树 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了.多多在合并果子时总共消耗的体力等于每次合并所消耗体力之和. 因为还要花大力气把这些果子搬回家,所以

树-堆结构练习——合并果子之哈夫曼树

树-堆结构练习——合并果子之哈夫曼树 Time Limit: 1000MS Memory limit: 65536K 题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了.多多在合并果子时总共消耗的体力等于每次合并所消耗体力之和. 因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节

重量平衡树之Treap:以随机优先级来维护堆结构,并满足BST性质

关于重量平衡树的相关概念可以参考姊妹文章:重量平衡树之替罪羊树 Treap是依靠旋转来维护平衡的重量平衡树中最为好写的一中,因为它的旋转不是LL就是RR 对于每一个新的节点,它给这个节点分配了一个随机数,用作优先级,然后以这个优先级来维护一个堆结构 由于堆本身就是完全二叉树结构,这样维护之后的树就无限接近于完全二叉树,所以还是很神奇的 这棵树满足BST的一切性质,除了不能处理序列问题之外已经无敌了 应该说,抛去动态树问题之外,这是实战最好用的树了 我们还是先看定义: struct Tree {

实现堆结构

总时间限制:  3000ms 内存限制:  65535kB 描述 定义一个数组,初始化为空.在数组上执行两种操作: 1.增添1个元素,把1个新的元素放入数组. 2.输出并删除数组中最小的数. 使用堆结构实现上述功能的高效算法. 输入 第一行输入一个整数t,代表测试数据的组数.对于每组测试数据,第一行输入一个整数n,代表操作的次数.每次操作首先输入一个整数type.当type=1,增添操作,接着输入一个整数u,代表要插入的元素.当type=2,输出删除操作,输出并删除数组中最小的元素.1<=n<

链式结构实现堆排序

在很多数据结构和算法的书上,"堆排序"的实现都是建立在数组上,数组能够通过下标访问其元素,其这一特性在堆排序的实现上,使得其编码实现比链式结构简单,下面我利用链表实现堆排序. 在"堆"这种数据结构中,分为"大根堆"和"小根堆","大根堆"中其每一个双亲节点大于等于其子女节点,"小根堆"的定义与其相 反, 当然实现最大堆之前必须要建一个堆,一个高度为h的堆,它的前h-1层时满的,如下图所示

c++ 堆的创建 堆排序

#pragma once #include<iostream> #include<vector> using namespace std; class BigHeap//仿函数类  大堆返回true { public: bool operator()() { return true; } }; class SmallHeap//仿函数类  小堆返回false { public: bool operator()() { return false; } }; template <