堆操作

作者: 壹顾倾城 | 来源:发表于2021-01-27 11:08 被阅读0次
/********************************
* 程序名称:堆
* 开发时间:
*******************************/
#include <iostream>
#include <cstdio>

using namespace std;

const int MAXS = 100;
 
int a[MAXS];       //堆数组 
int heap_size;     //堆大小 
//put()
void put(int x) {
    heap_size ++;          //堆尾+1 
    a[heap_size] = x;      //在堆尾部插入x
    int i = heap_size;     //当前堆指针
    int parent_i;          //父节点指针
    
    //不断堆化
    while(i > 1) {
        parent_i = i/2;    //父节点指针
        if(a[i] <= a[parent_i])    //满足大根堆,退出
            return;
        int temp = a[i];           //与父节点交换 
        a[i] = a[parent_i];
        a[parent_i] = temp;
        i = parent_i;      //父节点指针
    } 
} 

//get()
int get() {
    int top = a[1];       //获取根节点(堆顶) 
    a[1] = a[heap_size];  //将堆尾放到堆顶部
    heap_size --;
    int i = 1;                //当前指针指向堆顶
    int son_i;                //孩子节点指针
    
    while(i*2 <= heap_size) {
        son_i = i * 2;        //lchild
        //如有右孩子,且右孩子比左孩子要大,指向右孩子 
        if(son_i < heap_size && a[son_i + 1] > a[son_i]) {
            son_i ++;         //指向右孩子 
        } 
        if(a[i] >= a[son_i])  //符合大根堆性质  
            break;
        int temp = a[i];
        a[i] = a[son_i];
        a[son_i] = temp;
        
        i = son_i;
        
        return top;      //堆化完成,返回堆顶元素 
    }  
}

//把数组 i-n调整堆化
void heap(int a[], int i, int n) {
    int k;
    int temp = a[i];    //存储当前节点 
    for(k=2*i; k<=n; k*=2) {
        if(k<n && a[k] < a[k+1]) 
            k = k + 1;  //存在有节点,并且右节点笔左节点大,指向右孩子 
        if(temp > a[k]) //符合大根堆,退出 
            break;
        a[i] = a[k];    //否则交换当前节点和孩子节点的值 
        i = k;          //指向孩子节点 
    }
    a[i] = temp;       //将当前节点放在合适位置 
} 
//main() star
int main() {
    int x, count, n;
    cout << "请输入堆大小:";
    cin >> n;
    cout << "接下来请输入 " << n <<" 个数组件堆。\n"; 
    for(int i=1; i<=n; i++) {
        cin >> x;
        put(x);
    } 
    
    cout << "堆化数据:";
    for(int i=1; i<=n; i++) {
        cout << a[i] << ",";
    }
    cout << endl;
    
    cout << "从堆中取出顶素后堆化输出:"
    get();
    
    cout << "堆化数据:";
    for(int i=1; i<=n; i++) {
        cout << a[i] << ",";
    }
    cout << endl;
     
    //code here
    return 0;
}

测试1:

请输入堆大小:10
接下来请输入 10 个数组件堆。
9 5 1 2 3 41 56 2 1 45
堆化数据:56,45,41,2,5,1,9,2,1,3,
从堆中取出顶素后堆化输出:堆化数据:45,3,41,2,5,1,9,2,1,3,

--------------------------------
Process exited after 13.38 seconds with return value 0
请按任意键继续. . .

测试2:

请输入堆大小:8
接下来请输入 8 个数组件堆。
6 5 4 1 2 3 8 7
堆化数据:8,7,6,5,2,3,4,1,
从堆中取出顶素后堆化输出:堆化数据:7,1,6,5,2,3,4,1,

--------------------------------
Process exited after 7.078 seconds with return value 0
请按任意键继续. . .

相关文章

  • 堆操作

    测试1: 测试2:

  • 堆的基本操作

    堆的基本概念: 严格来讲,堆有不同的种类,但是我们在算法学习中,主要用的还是二叉堆,而二叉堆有最大堆和最小堆之分。...

  • 堆(heap)操作集

    优先队列(Priority Queue):特殊队列,取出元素的顺序是依照元素的优先权(关键字)大小,而不是元素进入...

  • 值拷贝和对象引用

    栈数据结构:先进后出,后进先出 堆数据结构:数据没有固定顺序,在堆操作在堆操作数据可以任何顺序操作 实例: 1.基...

  • 堆排序

    前言 本文主要介绍堆的构造, 元素在堆中的上浮操作以及下沉操作,最后讲述基于这些操作的堆排序, 不对优先队列作介绍...

  • 树 | 优先队列

    前提 向其中插入数字3:先把3放到堆的最好,然后进行堆的大小颠倒。 堆的操作复杂度:堆的两种操作所化的时间都和树的...

  • 2018-04-30 算法复杂度

    数据结构操作 数组排序算法 图操作 堆操作 大O复杂度图表

  • 堆 | 定义、操作、堆排序

    参考:胡凡,曾磊《算法笔记》 定义 堆是一棵完全二叉树。 完全二叉树:结点数量n,叶子结点数ceiling(n/2...

  • 算法复杂度速查表

    图例 数据结构操作 数组排序算法 图操作 堆操作 大 O 复杂度图表

  • 堆和堆排序

    什么是堆? 如何存储一个堆(如何实现一个堆?) 堆的插入、删除操作 如何基于堆实现排序?(建堆和排序) 为什么快速...

网友评论

      本文标题:堆操作

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