`
famoushz
  • 浏览: 2949121 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

数据结构堆的向量实现

阅读更多

 

 

数据结构堆的向量实现
/**//*********************************************************************
Title:C++数据结构堆
Author:Zhen.liang 
CopyRight:Diyinside Community CSTC
包括最小堆和最大堆两部分组成
*********************************************************************/
/**//*
for example:
#include <iostream>
#include "Heap.h"
using namespace std;
int main(){
 DiyinsideHeap::MaxHeap<char> cdata(30);
 cdata.Insert('3');
 cdata.Insert('e');
 cdata.Insert('k');
 cout<<"Demo MinHeap"<<endl;
 while(!cdata.IsEmpty()){
  cout<<cdata.RemoveMin()<<endl;
 }
 return 0;
}
*/
 
#include <vector>
#include <assert.h>
using namespace std;
namespace DiyinsideHeap...{
 //最小堆
 template<class Type>
 class MinHeap...{
 public:
  //构造函数空堆
  MinHeap(int maxsize = 10)...{
   assert(maxsize>=0);//限制输入大小为正
   MaxHeapSize = maxsize;//堆大小
   CurrentSize = 0;//当前存放大小
   data.resize(MaxHeapSize);//存储空间设置
  }
  //析构函数
  ~MinHeap()...{
   data.clear();
  }
  int HeapSize()const;//获得Heap大小
  int Insert(const Type&);//插入元素
  Type RemoveMin();//删除最小的元素
  int IsEmpty()const;//判断是否空
  int IsFull()const;//判断是否满
  int MakeEmpty();//置空
 private:
  vector<Type> data;//存储数组
  int CurrentSize;//当前存放个数
  int MaxHeapSize;//最大存放个数
  int FilterDown(int,int);//向下调整
  int FilterUp(int);//向上调整
 };
 template<class Type>
 int MinHeap<Type>::HeapSize()const...{
  return CurrentSize;
 }
 template<class Type>
 int MinHeap<Type>::MakeEmpty()...{
  CurrentSize = 0;
  return 1;
 }
 template<class Type>
 Type MinHeap<Type>::RemoveMin()...{
  if(!CurrentSize)...{
   return -1;
  }
  else...{
   Type temp = data[0];
   data[0] = data[CurrentSize-1];
   CurrentSize--;
   FilterDown(0,CurrentSize-1);
   return temp;
  }
 }
 template<class Type>
 int MinHeap<Type>::IsFull()const...{
  if(CurrentSize == MaxHeapSize)...{
   return 1;
  }
  else...{
   return 0;
  }
 }
 template<class Type>
 int MinHeap<Type>::Insert(const Type& Data)...{
  if(CurrentSize == MaxHeapSize)...{
   return -1;
  }
  else...{
   data[CurrentSize] = Data;
   FilterUp(CurrentSize++);
   return 1;
  }
 }
 template<class Type>
 int MinHeap<Type>::FilterUp(int start)...{
  int j = start ;
  int i = (j-1)/2;
  Type temp = data[j];
  while(j>0)...{
   if(data[i]<=temp)...{
    break;
   }
   else...{
    data[j] = data[i];
    j = i;
    i = (i - 1)/2;
   }
  }
  data[j] = temp;
  return 1;
 }
 template<class Type>
 int MinHeap<Type>::FilterDown(int start,int end)...{
  int i = start ;
  int j = 2*i + 1;
  Type temp = data[i];
  while(j<=end)...{
   if((j<end) && (data[j]>data[j+1]))...{
    j++;
   }
   if(temp<=data[j])...{
    break;
   }
   else...{
    data[i] = data[j];
    i = j;
    j = 2*j + 1;
   }
  }
  data[i] = temp;
  return 1;
 }
 template<class Type>
 int MinHeap<Type>::IsEmpty()const...{
  if(CurrentSize)...{
   return 0;
  }
  else...{
   return -1;
  }
 }

 //最大堆
 template<class Type>
 class MaxHeap...{
 public:
  //构造函数空堆
  MaxHeap(int maxsize = 10)...{
   assert(maxsize>=0);
   MaxHeapSize = maxsize;
   CurrentSize = 0;
   data.resize(MaxHeapSize);
  }
  //析构函数
  ~MaxHeap()...{
   data.clear();
  }
  int HeapSize()const;//获得Heap大小
  int Insert(const Type&);//插入元素
  Type RemoveMin();//删除最小的元素
  int IsEmpty()const;//判断是否空
  int IsFull()const;//判断是否满
  int MakeEmpty();//置空
 private:
  vector<Type> data;//存储数组
  int CurrentSize;//当前存放个数
  int MaxHeapSize;//最大存放个数
  int FilterDown(int,int);//向下调整
  int FilterUp(int);//向上调整
 };
 template<class Type>
 int MaxHeap<Type>::HeapSize()const...{
  return CurrentSize;
 }
 template<class Type>
 int MaxHeap<Type>::MakeEmpty()...{
  CurrentSize = 0;
  return 1;
 }
 template<class Type>
 Type MaxHeap<Type>::RemoveMin()...{
  if(!CurrentSize)...{
   return -1;
  }
  else...{
   Type temp = data[0];
   data[0] = data[CurrentSize-1];
   CurrentSize--;
   FilterDown(0,CurrentSize-1);
   return temp;
  }
 }
 template<class Type>
 int MaxHeap<Type>::IsFull()const...{
  if(CurrentSize == MaxHeapSize)...{
   return 1;
  }
  else...{
   return 0;
  }
 }
 template<class Type>
 int MaxHeap<Type>::Insert(const Type& Data)...{
  if(CurrentSize == MaxHeapSize)...{
   return -1;
  }
  else...{
   data[CurrentSize] = Data;
   FilterUp(CurrentSize++);
   return 1;
  }
 }
 template<class Type>
 int MaxHeap<Type>::FilterUp(int start)...{
  int j = start ;
  int i = (j-2)/2;
  Type temp = data[j];
  while(j>0)...{
   if(data[i]>=temp)...{
    break;
   }
   else...{
    data[j] = data[i];
    j = i;
    i = (i - 2)/2;
   }
  }
  data[j] = temp;
  return 1;
 }
 template<class Type>
 int MaxHeap<Type>::FilterDown(int start,int end)...{
  int i = start ;
  int j = 2*i + 1;
  Type temp = data[i];
  while(j<=end)...{
   if((j<end) && (data[j]<data[j+1]))...{
    j++;
   }
   if(temp>=data[j])...{
    break;
   }
   else...{
    data[i] = data[j];
    i = j;
    j = 2*j + 1;
   }
  }
  data[i] = temp;
  return 1;
 }
 template<class Type>
 int MaxHeap<Type>::IsEmpty()const...{
  if(CurrentSize)...{
   return 0;
  }
  else...{
   return -1;
  }
 }
}
pku1442

#include <stdio.h>
#include <memory.h>
#include <queue>
using namespace std;


const int MAXN=30005;


struct TMax
{
TMax(int tx):x(tx) {}
int x;
};


struct TMin
{
TMin(int tx):x(tx) {}
int x;
};


int d[MAXN],g[MAXN];
int n,m;
priority_queue<TMax> hmax;
priority_queue<TMin> hmin;


bool operator<(const TMax &a,const TMax &b)
{
return a.x<b.x;
}


bool operator<(const TMin &a,const TMin &b)
{
return a.x>b.x;
}


void Read()
{
memset(d,0,sizeof(d));
memset(g,0,sizeof(g));
scanf("%d%d",&n,&m);
int i;
for (i=1;i<=n;i++) scanf("%d",&d[i]);
for (i=1;i<=m;i++) scanf("%d",&g[i]);
}


void Work()
{
int i,j=1;
for (i=1;i<=n;i++)
{
   if (!hmax.empty()&&d[i]<hmax.top().x)
   {
    hmin.push(TMin(hmax.top().x));
    hmax.pop();
    hmax.push(TMax(d[i]));
   }
   else hmin.push(TMin(d[i]));
   while (j<=m&&g[j]==i)
   {
    printf("%d\n",hmin.top().x);
    hmax.push(TMax(hmin.top().x));
    hmin.pop();
    j++;
   }
}
}


int main()
{
//freopen("in.txt","r",stdin);
Read();
Work();
return 1;
}

用堆实现优先队列

#include<stdio.h>
    
  typedef struct  
  {      
  int   Object_ID;       
  int   Priority;   
  }HEAP;   
    
  void   siftdown(HEAP*   a,int   i,int   n)   
  {   //adjust the factors' order
  int   j;   
  HEAP   t;   
  t=a[i];   
  while((j=2*i+1)<n)   
          {   
              if(j<n-1&&a[j].Priority<a[j+1].Priority)   j++;   
              if(t.Priority<a[j].Priority)   
			  {   
                 a[i]=a[j];   
                 i=j;   
			  }   
               else   break;   
  }   
           a[i]=t;   
  }   
    
  void   heap_sort(HEAP*   a,int   n)   
  {//put the factors in hesp for each time and sort them for each time
   int   i;   
   HEAP   t;   
   for(i=(n-2)/2;i>=0;i--)   
      siftdown(a,i,n);   
   for(i=n-1;i>0;i--)   
   {   
    t=a[0];   
    a[0]=a[i];   
    a[i]=t;   
    siftdown(a,0,i);   
   }
  }   
    
  void   changeweight(HEAP*   a,int&   num,int   Object_ID,   int   new_priority)   
  {   
    for(int i=0;i<num;i++)   
    if(a[i].Object_ID==Object_ID)   break;   
    if(i==num)   printf("No   such   Object_ID!\n");   
    a[i].Priority=new_priority;   
    heap_sort(a,num);   
  }   
    
  void   dequeue(HEAP*   a,int&   num,int&   Object_ID)   
  {   
          Object_ID=a[0].Object_ID;   
          for(int   i=0;i<num-1;i++)   
              a[i]=a[i+1];   
          num--;   
          heap_sort(a,num);   
  }   
    
    
  void   enqueue(HEAP*   a,int   &num,int   Object_ID,   int   priority)   
  {   
        a[num].Object_ID=Object_ID;   
        a[num++].Priority=priority;   
  }   
    
    
  bool   isLeaf(HEAP   *h,int&   num,int   i)     
  {   
  if(i>num/2)   return   true;   
  return   false;   
  }   
    
  int   leftChild(HEAP   *h,int&   num,int   i)   
  {   
  if(2*i>num)   return   -1;     //the   node   has   not   a   left   child   
  return   2*i;   
  }   
    
  void   main()   
  {   
        int   Object_ID,Priority;   
        HEAP   h[50];   
        int   num;   
    
        num=0;   
        while(Object_ID)   
        {   
		scanf("%d%d",&Object_ID,&Priority);
                if(!Object_ID)   break;   
        enqueue(h,num,Object_ID,Priority);   
        }   
        heap_sort(h,num);   
        for(int   i=0;i<num;i++)   
		   printf("%d\t%d\n",h[i].Object_ID,h[i].Priority);
  }

 
分享到:
评论

相关推荐

    数据结构 堆

    堆是一种特殊的数据结构,它常被用于实现优先队列。在优先队列中,待删除的元素是优先级最高(或最低)的那个。堆结构允许在任何时间插入任意优先级的元素到队列中去。在计算机科学中,堆被定义为一棵每一个节点的...

    东北大学数据结构设计课设

    在数据结构的课程中,R语言可以用来实现和可视化数据结构,例如创建自定义数据类型,操作向量、矩阵和列表,或者使用数据框和因子来处理表格数据。R语言的包(如data.table、dplyr和tidyverse)提供了丰富的工具,...

    C++各种数据结构头文件,可以直接调用(含样例实现).rar

    这个压缩包"**C++各种数据结构头文件,可以直接调用(含样例实现).rar**"包含了C++实现的各种常见数据结构的头文件,方便开发者直接引用,同时也为学习者提供了实际的代码示例,帮助理解数据结构的工作原理。...

    数据结构 堆排序 输出每一趟结果

    用函数实现堆排序,并输出每趟排序的结果 Input 第一行:键盘输入待排序关键的个数n 第二行:输入n个待排序关键字,用空格分隔数据 Output 第一行:初始建堆后的结果 其后各行输出交换堆顶元素并调整堆的结果,数据...

    数据结构经典教材

    其次,《数据结构与算法》可能更加专注于数据结构的实践应用,它可能会介绍如何在实际编程中创建和操作这些数据结构,包括如何在内存中布局数据,以及如何通过C++或Java等高级语言实现。这本书可能会提供丰富的实例...

    数据结构C++模板实现

    在C++编程语言中,数据结构的实现通常利用其强大的面向对象特性以及模板机制来达到高度的灵活性和复用性。下面将详细讨论在C++中实现数据结构的一些关键知识点。 1. **链表**: 链表是一种非连续存储的数据结构,...

    免费:数据结构(c与c++与java三本书高清晰版).rar

    C++支持STL(标准模板库),其中包含了一些预定义的数据结构如向量、列表、集合、映射等,以及高效的算法,使得开发者能够更方便地使用数据结构。 JAVA版的《数据结构》则可能强调Java平台特有的数据结构实现,如...

    数据结构 陈明主编

    这些数据结构是构建复杂算法的基础,例如排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序)、搜索算法(如深度优先搜索和广度优先搜索)等。 数组是最基础的数据结构,它提供了一种在内存中...

    数据结构与算法课程设计-基于Rust的数据结构与算法实现

    在“数据结构与算法课程设计-基于Rust的数据结构与算法实现”项目中,我们可以深入探讨Rust编程语言如何被用来高效地实现各种经典数据结构和算法。Rust是一种系统级编程语言,以其内存安全、并发性和高性能而受到...

    数据结构C++清华大学殷人昆代码上

    C++的模板机制使得代码可以高度通用,同时STL(Standard Template Library)提供了包括向量、链表、集合、映射等现成的数据结构,为开发者提供了便利。 殷人昆教授的代码可能包括了以下常见的数据结构: 1. **数组...

    数据结构实用教程C++版(万健)课件

    堆是一种可以快速找到最大或最小元素的数据结构,常用于实现优先队列。散列和位图则提供了快速的查找和存储机制,尤其适用于大量数据的处理。 通过这七章的学习,读者不仅能理解各种数据结构的原理,还能掌握C++...

    算法:算法C语言实现 第1-4部分 基础知识、数据结构、排序及搜索

    算法:C语言实现 (第1-4部分)基础知识、数据结构、排序及搜索(原书第3版) 本书是Sedgewick彻底修订和重写的C算法系列的第一本。全书分为四部分,共16章。第一部分“基础知识”(第1—2章)介绍基本算法分析原理。...

    数据结构面试题

    堆是一种特殊的树形数据结构,满足堆属性(父节点的值大于或小于其子节点),通常用于优先队列的实现。哈希表利用哈希函数快速定位元素,提供常数时间的查找、插入和删除操作,但可能会有哈希冲突问题,需要通过链...

    数据结构(李春葆)

    数据结构的实现通常涉及指针的使用,C语言提供了底层的内存管理,能直接操作内存,因此是实现数据结构的理想选择。例如,通过指针实现链表的节点链接,用数组模拟堆栈和队列,利用位运算实现位向量等。 李春葆教授...

    数据结构(入门教程)

    此外,还有堆数据结构,分为最大堆和最小堆,它们满足父节点的值大于或等于(最大堆)或小于或等于(最小堆)其子节点的值,常用于优先级队列的实现。 图数据结构由节点(顶点)和边组成,可以表示复杂的网络关系。...

    数据结构经典算法实现的C程序源代码

    - **堆**:堆是一种特殊的树形数据结构,通常用于优先队列的实现,分为最大堆和最小堆。 5. **图**:图是由顶点和边构成的数据结构,用于表示对象之间的关系。源代码可能包含了图的邻接矩阵和邻接表两种存储方式,...

    数据结构课件(全).rar

    7. **堆**:堆是一种特殊的树形数据结构,满足堆属性(最大堆或最小堆),常用于优先队列的实现。 8. **堆排序和优先队列**:堆排序利用堆的特性进行排序,而优先队列是基于堆的数据结构,能实现快速的查找最大或...

    华中科技大学数据结构课件

    在数据结构中,位运算常用于高效地处理和存储数据,例如在位向量中表示集合或在位操作中优化空间利用率。 十一、排序与查找 排序算法如冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序等,都是数据结构...

Global site tag (gtag.js) - Google Analytics