C语言实现创建堆(两种方式)

文章目录

  • 堆的创建
    • 一、定义堆及初始化堆
    • 二、插入法创建堆
    • 三、调整已有元素创建堆
  • 完整代码


 

堆的创建

本文介绍创建最大堆,最小堆可模仿创建
堆的创建有两种方式:
1.一个一个元素插入,插入一个就调整为堆
2.给定一定数目的元素,然后整体调整为堆


 

一、定义堆及初始化堆

不管是哪种方式,我们都要先初始化好堆

#include 
#include 

#define MaxData INT_MAX;

typedef int DataType;

typedef struct HeapStruct *MaxHeap;
struct HeapStruct{
     
	DataType *data;
	int size;//堆当前元素个数 
	int capacity;//堆的最大容量 
};

//初始化最大堆
MaxHeap Creat(int MaxSize){
     
	MaxHeap H=malloc(sizeof(struct HeapStruct));
	//第一个不作为堆的元素 
	H->data=malloc((MaxSize+1)*sizeof(DataType));
	H->size=0;
	H->capacity=MaxSize;
	//第一个元素作为标记元素 
	H->data[0]=MaxData;
	return H;
}

 

二、插入法创建堆

核心代码如下:

//插入元素
void Insert(MaxHeap H,DataType item){
     
	int i;
	if(IsFull(H)){
     
		printf("最大堆已满!");
		return;
	}
	i=++H->size;
	for(;H->data[i/2]<item;i/=2)
		H->data[i]=H->data[i/2];
	H->data[i]=item;
}

有关插入法创建堆可以查看这篇文章:C语言:堆的基本操作
里面讲述了用插入方法创建堆,以及创建好堆之后调用的各种方法。

 

三、调整已有元素创建堆

假设,我们有一系列元素,我们要调整这些元素,使之成为堆。
这种方法中的核心方法PercDown和删除堆的最大/小元素类似!
有关删除可以查看这篇文章:C语言:堆的基本操作

//构造最大堆
void PercDown(MaxHeap H,int p){
     
	int parent,child;
	DataType x;
	
	x=H->data[p];
	for(parent=p;parent*2<=H->size;parent=child){
     
		child=parent*2;
		if((child!=H->size)&&(H->data[child]<H->data[child+1])){
     
			child++;
		}
		if(x>=H->data[child])break;
		else
			H->data[parent]=H->data[child];
	}
	H->data[parent]=x;
} 

void BuildHeap(MaxHeap H){
     
	//调整H->data[]中的元素,使之成为最大堆
	int i;
	//从最后一个父结点开始调整,到第一个父结点 
	for(i=H->size/2;i>0;i--){
     
		PercDown(H,i);
	} 
}

 

完整代码

以下是调整已有元素成为最大堆的完整代码:

#include 
#include 

#define MaxData INT_MAX;

typedef int DataType;

typedef struct HeapStruct *MaxHeap;
struct HeapStruct{
     
	DataType *data;
	int size;//堆当前元素个数 
	int capacity;//堆的最大容量 
};

//初始化最大堆
MaxHeap Creat(int MaxSize){
     
	MaxHeap H=malloc(sizeof(struct HeapStruct));
	//第一个不作为堆的元素 
	H->data=malloc((MaxSize+1)*sizeof(DataType));
	H->size=0;
	H->capacity=MaxSize;
	//第一个元素作为标记元素 
	H->data[0]=MaxData;
	return H;
}

//构造最大堆
void PercDown(MaxHeap H,int p){
     
	int parent,child;
	DataType x;
	
	x=H->data[p];
	for(parent=p;parent*2<=H->size;parent=child){
     
		child=parent*2;
		if((child!=H->size)&&(H->data[child]<H->data[child+1])){
     
			child++;
		}
		if(x>=H->data[child])break;
		else
			H->data[parent]=H->data[child];
	}
	H->data[parent]=x;
} 

void BuildHeap(MaxHeap H){
     
	//调整H->data[]中的元素,使之成为最大堆
	int i;
	//从最后一个父结点开始调整,到第一个父结点 
	for(i=H->size/2;i>0;i--){
     
		PercDown(H,i);
	} 
}

int main(int argc, char *argv[]) {
     
	MaxHeap H;
	H=Creat(10);
	
	//为data数组设置元素
	H->data[1]=5;
	H->data[2]=2;
	H->data[3]=3;
	H->data[4]=6;
	H->data[5]=4;
	H->size=5;
	
	//建立最大堆
	BuildHeap(H);
	
	//输出
	int i;
	for(i=1;i<=5;i++){
     
		printf("%d ",H->data[i]);
	}
	return 0;
}

 

你可能感兴趣的:(算法和数据结构)