堆-C语言

堆-C语言

具体代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct Heap{
	int *data;
	int size;
	int capacity;
}Heap;

void Swap(int *a,int *b){
	int temp=*a;
	*a=*b;
	*b=temp;
}

void AdjustDown(Heap *H,int root,int n){
	if(H){
		int parent=root;
		int child=parent*2+1; 
		while(child<n){
			if(H->data[child]<H->data[child+1]){
				child++;
			}
			if(H->data[child]>H->data[parent]){
				Swap(&H->data[parent],&H->data[child]);
			}
			parent=child;
			child=2*parent+1;
		}
	}else{
		printf("向下调整数据失败");
		return;
	}
}

void AdjustUp(Heap *H,int n){
	if(H){
		int parent=(n-1)/2;
		int child=n; 
		while(child>0){
			if(H->data[child]<H->data[child+1]){
				child++;
			}
			if(H->data[child]>H->data[parent]){
				Swap(&H->data[parent],&H->data[child]);
			}
			child=parent;
			parent=(child-1)/2;
		}
	}else{
		printf("向上调整数据失败");
		return;
	}
}

void Init(Heap *H,int* arr,int n){
	if(H){
		H->data=(int*)malloc(sizeof(int*)*n);
		memcpy(H->data,arr,sizeof(int*)*n);
		H->size=n;
		H->capacity=n;
		for(int i=(n-2)/2;i>=0;i--){
			AdjustDown(H,i,n);
		}
	}else{
		printf("初始化失败");
		return;
	}
}

void Push(Heap *H,int e){
	if(H){
		if(H->size>=H->capacity){
			int newCapacity=(H->capacity==0)?5:H->capacity*2;
			H->data=(int*)realloc(H->data,sizeof(int)*newCapacity);
			if(H->data){
				H->capacity=newCapacity;
			}else{
				printf("重新分配空间失败");
				return;
			}
			H->data[H->size++]=e;
			AdjustUp(H,H->size-1);
		}
	}else{
		printf("初始化失败");
		return;
	}
} 

void Pop(Heap *H){
	if(H){
		Swap(&H->data[0],&H->data[H->size-1]);
		H->size--;
		AdjustDown(H,0,H->size-1);
	}else{
		printf("没有元素无法出栈");
		return;
	}
}

void HeapSort(Heap *H,int n){
	if(n==2){
		if(H->data[0]>H->data[1]){
			printf("%d %d",H->data[1],H->data[0]);
		}else{
			printf("%d %d",H->data[0],H->data[1]);
		}	
		return;
	}
	for(int i=n/2;i>=0;i--){//i>=0 
		if(H->data[i]>H->data[2*i+1]&&2*i+1<n){//注意size 
			Swap(&H->data[i],&H->data[2*i+1]);
		}
		if(H->data[i]>H->data[2*i+2]&&2*i+2<n){//注意size 
			Swap(&H->data[i],&H->data[2*i+2]);
		}
	}
	int temp=H->data[0];
	H->data[0]=H->data[n-1];
	H->data[n-1]=temp;
	printf("%d ",H->data[n-1]);
	HeapSort(H,n-1);
}
int main(){
	int arr[]={ 1, 5, 3, 8, 7, 6 };
	int size = sizeof(arr) / sizeof(arr[0]);
	Heap H;
	Init(&H,arr,size);
	Push(&H,0);
	Pop(&H);
	HeapSort(&H,H.size);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值