美文网首页
数据结构 树的应用(1)堆

数据结构 树的应用(1)堆

作者: 烤肉拌饭多加饭 | 来源:发表于2018-04-14 23:07 被阅读0次

堆heap

堆的存储

堆的结构:堆(二叉堆)实际上是完全二叉树,所以可以用数组来实现堆的结构。

便于检索
数组下标i从1开始,对于下标为i的节点,i/2为其父节点的下标,2i和2i+1为其左孩子,右孩子节点下标

堆的部分有序性:
MaxHeap任一节点的值大于或等于其子节点的值
MinHeap任一节点的值小于或者等于其子节点的值


堆(Binary Heap)的实现

实现最小堆代码(参考自geeksforgeeks:binary-heap)

/*用数组实现最小堆*/
#include<iostream>
using namespace std;

class MinHeap
{
private:
    int *heap;//实际上用vector更方便一点 
    int MaxLength;//数组大小
    int curlen;//数组当前长度
    void shiftUp(int index);//在尾部加入一个数,用递归和父亲节点比较
    void shiftDown(int index);//父节点和子节点比较,往下走(也是递归)
public:
    MinHeap(int *array,int length);//构造函数,调用了heaify()
    MinHeap();
    void heapify();//堆化
    void print();//打印数组
    void deleteMin();//用最后一个元素代替顶部元素,然后shiftDown(0)
    void insertElement(int element);//在尾部插入一个数,然后shiftUp(index)和父节点比较往上走

};
MinHeap::MinHeap(int *array, int length) {
    MaxLength = length;
    curlen = length;
    heap = new int(length);
    for (int i = 0; i < length; i++) {
        heap[i] = array[i];
    }
    heapify();//建立最小堆
}
MinHeap::MinHeap(){}
void MinHeap::print() {
    for (int i= 0; i < curlen; i++) {
        cout << heap[i]<<" ";
    }
    cout << endl;
}
void MinHeap::heapify() {
    for (int i = (curlen - 1) / 2; i >= 0; i--) {
        shiftDown(i);
    }
}
void MinHeap::shiftUp(int index) {
    int child = index;
    int parent = (index - 1) / 2;
    if (child == 0)return;
    if (heap[child] < heap[parent]) {
        swap(heap[child], heap[parent]);
        shiftUp(parent);
    }
}
void MinHeap::shiftDown(int index) {
    int parent = index;
    int lchild = parent * 2 + 1;
    int rchild = lchild + 1;
    if (lchild >= curlen) {//叶节点
        return;
    }
    int min = lchild;
    if (rchild<curlen && heap[min] > heap[rchild]) {//父节点和较小的子节点比较
        min = rchild;
    }
    if (heap[parent] > heap[min]) {
        swap(heap[parent], heap[min]);
        shiftDown(min);
    }

    /*for (int i = parent; parent*2 < MaxLength; parent = child) {
        child = 2 * parent + 1;
        if (heap[child] < heap[child + 1]) {//父节点和较小的子节点比较
            child++;
        }
        if (heap[parent] > heap[child]) {
            swap(heap[parent], heap[child]);
        }
        else {
            break;
        }
    }*/
}
void MinHeap::deleteMin() {
    //即删掉最顶上的
    if (curlen > 0) {
        heap[0] = heap[curlen - 1];//用最后一个替代
        curlen--;
        shiftDown(0);
    }
    else {
        cout << "the heap is empty!" << endl;
        return;
    }
    
}
void MinHeap::insertElement(int element) {
    if (curlen == MaxLength) {
        cout << "the heap is full!" << endl;
    }
    else {
        heap[curlen] = element;
        curlen++;
        shiftUp(curlen-1);
    }
}

Heap Sort堆排序

比如就用上面的最小堆,每次都输出最顶上的值(一定是最小值),直到删完堆

//给MinHeap加了两个函数
    int getCurLen() { return curlen; }
    int topMin() { if (curlen > 0)return heap[0]; else return -1; }
class HeapSort
{
public:
    HeapSort(MinHeap heap) {
        while (heap.getCurLen() >0) {
            cout << heap.topMin() << " ";
            heap.deleteMin();
        }
    }
};

相关文章

  • 数据结构 树的应用(1)堆

    堆heap 堆的存储 堆的结构:堆(二叉堆)实际上是完全二叉树,所以可以用数组来实现堆的结构。 便于检索数组下标i...

  • 数据结构与算法目录与大纲

    1.数据结构 1.1 基本的数据结构 基本数据结构ADT及其实现常用数据结构对比及其应用场景查找树(搜索树)优先队...

  • 数据结构 - 概要

    数组 链表 堆/栈/队列 树 数据结构 - 二叉树数据结构 - 二叉查找树数据结构 - 平衡二叉树数据结构 - A...

  • 堆结构的实现

    堆的定义: 这里的堆是指一种数据结构(或数据结构属性),非指堆内存。堆属性用二叉树来体现,具有堆属性的数据结构才可...

  • 数据结构:八大数据结构分类

    数据结构分类 1、数组 2、栈 3、队列 4、链表 5、树 6、散列表 7、堆 8、图 数据结构分类 数据结构是指...

  • java堆排序

    什么是堆排序:图解堆排序堆排序:利用了堆这种数据结构堆数据结构:特殊的完全二叉树,因为具有以下的特点:1)每个结点...

  • 堆和堆排序

    我们今天讲另外一种特殊的树,“堆”(Heap)。堆这种数据结构的应用场景非常多,最经典的莫过于堆排序了。堆排序是一...

  • 数据结构:八大数据结构分类

    本文目录: 数据结构分类 1、数组 2、栈 3、队列 4、链表 5、树 6、散列表 7、堆 8、图 数据结构分类 ...

  • 第1课:为什么要学习数据结构与算法?如何学习?

    1、什么是数据结构 广义上讲:数据结构就是一组数据的存储结构。狭义上讲:队列、栈、堆、树 等常用的数据结构。 2、...

  • 数据结构中堆、栈和队列的理解

    一、堆 堆是一种经过排序的树形数据结构,每个节点都有一个值,通常我们所说的堆的数据结构是指二叉树。所以堆在数据结构...

网友评论

      本文标题:数据结构 树的应用(1)堆

      本文链接:https://www.haomeiwen.com/subject/ycnlkftx.html