打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
最大-最小堆 删除算法实现

#include <cmath>
#include <iostream>
using namespace std;

#define MAXSIZE 1000  //堆中最多元素数目

//定义堆得结构
struct element {
    int key;
};

element heap[MAXSIZE];

//判断节点所在层,最小层返回true
bool level(int i)
{
    double k = log((double)i)/log(2.0);
    if((int)k%2 ==0){
        return true;
    }
    else{
        return false;
    }
}

//在最大层调整,将item插入合适位置---(insert的子函数)
void max_verify(element heap[], int n, element item)
{
    int i = n;
    int parent = n/4;
    while(parent) {
        if(heap[parent].key < item.key) {
            heap[i] = heap[parent];
            i = parent;
            parent = parent/4;
        }
  else
            break;
    }
    heap[i] = item;
}

//最小层调整,将item插入合适位置---(insert的子函数)
void min_verify(element heap[], int n, element item)
{
    int i = n;
    int parent = n/4;
    while(parent) {
        if(heap[parent].key > item.key) {
            heap[i] = heap[parent];
            i = parent;
            parent = parent/4;
        }
  else
            break;
    }
    heap[i] = item;
}

//插入一个元素
void insert(element heap[], int *n, element item)
{
    (*n)++;
 //若达到堆的最大容量,直接退出
    if(*n == MAXSIZE) {
  cout<< "heap is full." << endl;
        exit(1);
    }

 //若原堆为空,则直接加入
    if(*n == 1) {
        heap[*n].key = item.key;
        return;
    }

 //普通情况的插入
    int parent = *n/2;
    switch(level(parent)) {
case true:
    if(heap[parent].key > item.key) {
        heap[*n] = heap[parent];
        min_verify(heap, parent, item);
    } else {
        max_verify(heap, *n, item);
    }
    break;
case false:
    if(heap[parent].key < item.key) {
        heap[*n] = heap[parent];
        max_verify(heap, parent, item);
    } else {
        min_verify(heap, *n,item);
    }
    break;
    }
}

//寻找子节点和后序节点中最小的节点---(del_min的子函数)
int min_grand_child(element heap[], int n, int i)
{
    int min = 2*i;
    int k[5] = {2*i+1, 4*i, 4*i+1, 4*i+2, 4*i+3};
    for(int j=0; k[j]<=n&&j<=4; ++j) {
        if(heap[k[j]].key < heap[min].key)
            min = k[j];
    }
    return min;
}

//删除最小元素,返回最小节点
element del_min(element heap[], int *n)
{
    //没有元素时,直接退出
    if(*n < 1) {
  cout << "heap is empty." << endl;
        exit(1);
    }

    //只有一个元素,直接删除
    if(*n == 1){
        return heap[(*n)--];
    }

    //一般情况的删除最小元
    element item = heap[(*n)--];

    heap[0].key = heap[1].key;
    int k, i, last = (*n)/2, parent;
    for(i=1; i<=last; ) {
        k = min_grand_child(heap, *n, i);
        if(item.key <= heap[k].key){
            break;
        }
        heap[i] = heap[k];

        if(k <= 2*i+1) {
            i = k;
            break;
        }
        parent = k/2;
        if(item.key > heap[parent].key) {
            element temp = item;
            item = heap[parent];
            heap[parent] = temp;
        }
        i = k;
    }
    heap[i] = item;
    return heap[0];
}

//寻找子节点和后序节点中最大的节点---(del_max的子函数)
int max_grand_child(element heap[], int n, int i)
{
    int max = 2*i;
    int k[5] = {2*i+1, 4*i, 4*i+1, 4*i+2, 4*i+3};
    for(int j=0; k[j]<=n&&j<=4; ++j) {
        if(heap[k[j]].key > heap[max].key)
            max = k[j];
    }
    return max;
}

//删除最大元素
element del_max(element heap[], int *n)
{
    //没有元素时,直接退出
    if(*n < 1) {
  cout << "heap is empty." << endl;
        exit(1);
    }

    //只有一个元素,直接删除
    if(*n == 1){
        return heap[(*n)--];
    }

    //一般情况的删除最大元
    element item = heap[(*n)--];

    int minpos = max_grand_child(heap, *n, 1);

    heap[0].key = heap[minpos].key;

    int k, i, last = (*n)/2, parent;
    for(i= minpos; i<=last; ) {
        k = max_grand_child(heap, *n, i);
        if(item.key >= heap[k].key){
            break;
        }
        heap[i] = heap[k];

        if(k <= 2*i+1) {
            i = k;
            break;
        }
        parent = k/2;
        if(item.key < heap[parent].key) {
            element temp = item;
            item = heap[parent];
            heap[parent] = temp;
        }
        i = k;
    }
    heap[i] = item;
    return heap[0];
}

//驱动程序
int main()
{
    int n = 0,i,size;

 //构造初始堆
 cout << "Input the capacity of the heap(no more than 1000): ";
 cin >> size;
    for( i=1; i<=size; ++i) {
        element item;
        item.key = i;
        insert(heap, &n, item);
    }

    for( i=1; i<=n; ++i)
  cout<< heap[i].key << " ";
 cout << endl;
 
    element e = del_max(heap, &n);
    for(i=1; i<=n; ++i)
  cout << heap[i].key << " ";
 cout << "\tthe maxium element is: " << e.key << endl;
 
    e = del_min(heap, &n);
    for(i=1; i<=n; ++i)
  cout << heap[i].key << " ";
 cout << "\tthe minimum element is: " << e.key << endl;
 
    return 0;
}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
从n个数中提取最小的m个数的算法
Gone Fishing 贪心算法
《算法导论》读书笔记之第6章 优先级队列
二叉排序树(BST)的判定(其实不容易)
几种C++排序算法的实现(冒泡,归并,快速,插入,选择)
C++ *max_element函数找最大元素 *min_element函数找最小元素 STL算法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服