堆-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--){
if(H->data[i]>H->data[2*i+1]&&2*i+1<n){
Swap(&H->data[i],&H->data[2*i+1]);
}
if(H->data[i]>H->data[2*i+2]&&2*i+2<n){
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);
}