最小堆(优先队列)基本概念,即一个完整建立,插入,删除代码

堆(优先队列)priority queue
特殊的队列,取出元素的顺序是依照元素的优先权(关键字)大小,而出元素进入队列的先后顺序
操作:查找最大值(最小值),删除(最大值)

数组:
链表:
有序数组:
有序链表:

采用二叉搜索树? NO

采用完全二叉树 YES
堆的连个特性
结构性:用数组表示的完全二叉树:
有序性:任一结点的关键字是其字树所有结点的最大值(或最小值)
最大堆(MaxHeap)也称大顶堆:最大值
最小堆(MinHeap)也称“小顶堆”:最小值
从根节点到任意结点路径上结点序列的有序性
操作:插入任意一个元素,删除最 大值元素
最大堆的删除:取出根节点(最大值)元素,同时删除堆的一个结点

最大堆的建立:将已存在的N个元素按最大堆的要求存放在一个以为数组中

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 //最小堆
  4
  5 #define ElementType int
  6 #define MaxSize 15
  7 #define MinData -1
  8
  9 typedef struct HeapNode * MinHeap;
 10 struct HeapNode {
 11     int Capacity;
 12     int Size;
 13     ElementType *element;
 14 };
 15
 16 MinHeap InitHeap(int maxsize)
 17 {
 18     MinHeap H = (MinHeap)malloc(sizeof(struct HeapNode));
 19     H->element = (ElementType*)malloc(sizeof(struct HeapNode) * (maxsize + 1));
 20     H->Capacity = maxsize;
 21     H->Size = 0;
 22     H->element[0] = MinData;
 23     for (int i = 1; i < maxsize + 1; i++)
 24         H->element[i] = 0;
 25     return H;
 26 }
 27
 28 void CreateHeap(MinHeap H, int position)
 29 {
 30     int val;
 31     scanf_s("%d", &val);
 32     H->Size++;
 33     if (val == 0 || position > MaxSize)
 34     {
 35         H->Size--;
 36         return;
 37     }
 38     H->element[position] = val;
 39     //printf("please enter %d left child:\n", val);
 40     CreateHeap(H, position * 2);
 41     //printf("please enter %d right child:\n", val);
 42     CreateHeap(H, position * 2 + 1);
 43 }
 44
 45 int IsEmpty(MinHeap H)
 46 {
 47     return H->Size == 0;
 48 }
 49
 50 int IsFull(MinHeap H)
 51 {
 52     return H->Size == MaxSize;
 53 }
 54
 55 void Insert(MinHeap H, ElementType item)
 56 {
 57     int i;
 58     if (IsFull(H))
 59     {
 60         printf("The heap is full\n");
 61         return;
 62     }
 63     i = ++H->Size;
 64     for (; H->element[i / 2] > item; i /= 2)
 65         H->element[i] = H->element[i / 2];
 66     H->element[i] = item;
 67 }
 68
 69 ElementType Delete(MinHeap H)
 70 {
 71     ElementType temp, Min;
 72     int parent = 1, child;
 73     if (IsEmpty(H))
 74     {
 75         printf("The heap is empty!\n");
 76         return 0;
 77     }
 78     Min = H->element[1];
 79     temp = H->element[H->Size--];
 80     for (; 2 * parent <= H->Size; parent = child)
 81     {
 82         child = 2 * parent;
 83         if (child != H->Size && (H->element[child + 1] < H->element[child]))
 84             child++;
 85         if (temp <= H->element[child]) break;
 86         else
 87             H->element[parent] = H->element[child];
 88     }
 89     H->element[parent] = temp;
 90     return Min;
 91 }
 92
 93 void printHeap(MinHeap H, int position, int depth)
 94 {
 95     while(depth--)
 96         printf("   ");
 97     printf("%d\n", H->element[position]);
 98 }
 99
100 void InOrderTraversal(MinHeap H, int position, int depth)
101 {
102     if (!IsEmpty(H) && position <= H->Size)
103     {
104         InOrderTraversal(H, position * 2 + 1, depth + 1);
105         printHeap(H, position, depth);
106         InOrderTraversal(H, position * 2, depth + 1);
107     }
108 }
109
110
111
112 int main()
113 {
114     MinHeap  H = InitHeap(15);
115     CreateHeap(H, 1);
116     InOrderTraversal(H, 1, 0);
117     printf("\nAfter inserting:\n");
118     Insert(H, 14);
119     InOrderTraversal(H, 1, 0);
120     printf("\nAfter deleting:\n");
121     Delete(H);
122     InOrderTraversal(H, 1, 0);
123
124
125
126
127     return 0;
128 }

原文地址:https://www.cnblogs.com/hi3254014978/p/9527060.html

时间: 2024-11-05 23:28:46

最小堆(优先队列)基本概念,即一个完整建立,插入,删除代码的相关文章

最大堆/最小堆/优先队列 实现代码(c++)

自我感觉代码写的比较乱,这方面要好好注意一下. 总结: 1.在使用vector<int>::size_type 类似的类型时,千万要注意循环的条件判断,很容易发生溢出的危险!所以我最后很懒的选择使用int  - -. 2.下标表示和元素个数表示之间的细微差别.下标之间的变换关系: 父节点 parent(i)=(i-1)/2; 左孩子 left(i)=2*i+1;右孩子 right(i)=2*i+2 class Max_Heap{ typedef int index; public: Max_H

13 一个完整的链栈代码

项目结构: main.cpp: #include <iostream> #include<stdio.h> #include<stdlib.h> #include "function_for_LinkStack.h" using namespace std; int main() { TestLinkStack(); return 0; } function_for_LinkStack.h: #ifndef FUNCTION_FOR_LINKSTAC

最小堆的维护,POJ(2051)

题目链接:http://poj.org/problem?id=2051 ///维持最小堆(优先队列)POJ2051 #include <iostream> #include <string> using namespace std; struct Node { int Now; ///出堆的时间 int id; int p; ///时间间隔 }; Node node [3001]; int K; ///输出个数 void down (Node H[],int s,int m) {

初学算法-基于最小堆的优先级队列C++实现

笔者近日实现了最小堆类及其派生的优先级队列,特将代码奉上,不足之处还请指出! 在实现优先级队列时,笔者表示萌萌哒没有用过template写派生类,结果写完了出现error: *** was not decleared in this scope..后来各种补上this->才完事,在CSDN(笔者的帖子地址? http://bbs.csdn.net/topics/391806995)上提问后才知道是模板参数依赖,笔者表示涨姿势了.. /**  * The Minimum Heap Class an

hdu 4006 The kth great number (优先队列+STB+最小堆)

The kth great number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 6637    Accepted Submission(s): 2671 Problem Description Xiao Ming and Xiao Bao are playing a simple Numbers game. In a roun

优先队列及最小堆最大堆

为什么优先队列里默认是堆(heap)实现,默认是优先级高的出队,定义结构体重载函数为什么要按照从小到大排序?原来是自己对优先队列还不太了解: 1 堆 1.1 简介 n个关键字序列Kl,K2,-,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质): (1)ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n),当然,这是小根堆,大根堆则换成>=号.//k(i)相当于二叉树的非叶结点,K(2i)则是左孩子,k(2i+1)是右孩子 若将此序列所存储的向量R[1..n]看做是一

优先队列的实现(最小堆)

使用最小堆实现优先队列 定义上浮函数和下浮函数,对每一次加入的新节点,重新维护最小堆 代码: public class PriorityMinQueue { private int[] arr; private int size; /** * 返回优先队列的大小 * * @return */ public int Size() { return size; } public PriorityMinQueue() { this(20); } /** * 初始化优先队列 * * @param cap

Black Box--[优先队列 、最大堆最小堆的应用]

Description Our Black Box represents a primitive database. It can save an integer array and has a special i variable. At the initial moment Black Box is empty and i equals 0. This Black Box processes a sequence of commands (transactions). There are t

Jcompress: 一款基于huffman编码和最小堆的压缩、解压缩小程序

前言 最近基于huffman编码和最小堆排序算法实现了一个压缩.解压缩的小程序.其源代码已经上传到github上面: Jcompress下载地址 .在本人的github上面有一个叫Utility的repository,该分类下面有一个名为Jcompress的目录便是本文所述的压缩.解压缩小程序的源代码.后续会在Utility下面增加其他一些实用的小程序,比如基于socket的文件断点下载小程序等等.如果你读了此文觉得还不错,不防给笔者的github点个star, 哈哈.在正式介绍Jcompres