堆的建立与排序

#include "Heap.h"

void HeapSort()

{

int i = 0;

int arr[] = { 1,9,8,6,2,3,4,5,7,88,66,99,77 };

int sz = sizeof(arr)/sizeof(arr[0]);

BuildHeap_max( arr,sz);//建立大堆,采用向下调整

for( ; sz != 1 ; sz--)

{

swap(&arr[0],&arr[sz-1]);

Adjustdown_max(arr , sz-1 , 0 );//将最大值放到堆顶

}

}

int main()

{

HeapSort();

}

#include "Heap.h"

void HeapInit(HP* hp)

{

int arr[6] = { 2,3,6,4,5,7 };

hp->size = 6;

hp->capacity = 10;

hp->arr = (HPDataType*)malloc(sizeof(HPDataType)*6);

memcpy(hp->arr,arr,6*sizeof(HPDataType));

//hp->size = 0;

//hp->capacity = 0;

//hp->arr = NULL;

}

void HeapPush(HP* hp,HPDataType x)

{

int newcapacity = 0;

HPDataType* tmp = NULL;

if( hp->size == hp->capacity )

{

newcapacity = hp->capacity == 0 ? 4 : 2 * hp->capacity ;

tmp = (HPDataType*)realloc(hp->arr,sizeof(HPDataType)*newcapacity);

if( tmp == NULL )

{

perror("realloc fail");

exit(1);

}

else

{

hp->arr = tmp;

hp->capacity = newcapacity;

}

}

hp->arr[hp->size] = x;

hp->size++;

Adjustup_min(hp->arr,hp->size-1);

}

//小堆

void Adjustup_min(HPDataType* arr , int child )

{

int father = 0;

while( child )

{

father = (child - 1)/2;

if( arr[child] < arr[father] )

{

swap(&arr[child],&arr[father]);

child = father;

}

else

{

break;

}

}

}

//大堆

void Adjustup_max(HPDataType* arr , int child )

{

int father = 0;

while( child )

{

father = (child - 1)/2;

if( arr[child] > arr[father] )

{

swap(&arr[child],&arr[father]);

child = father;

}

else

{

break;

}

}

}

void swap(HPDataType* a , HPDataType* b )

{

HPDataType temp;

temp = *a;

*a = *b;

*b = temp;

}

void HeapPop(HP* hp)

{

assert(hp);

assert(hp->size);

swap(&hp->arr[0],&hp->arr[hp->size-1]);

hp->size--;

Adjustdown_max(hp->arr,hp->size,0);

}

//大堆

void Adjustdown_max(HPDataType* arr , int size , int father)

{

int child = 0;

while( 2 * father + 1 < size )

{

//假设法,假设child为最小的

child = 2 * father + 1;

if( child != size -1 && arr[child] < arr[child+1] )//要防止对右孩子解引用

{

child++;

}

if( arr[father] < arr[child] )

{

swap(&arr[father],&arr[child]);

father = child;

}

else

{

break;

}

}

}

void Adjustdown_min(HPDataType* arr , int size , int father)//size是数组的元素个数,father是当前交换的父亲节点

{

int child = 0;

while( 2 * father + 1 < size )

{

//假设法,假设child为最小的

child = 2 * father + 1;

if( child != size -1 && arr[child] > arr[child+1] )//要防止对右孩子解引用

{

child++;

}

if( arr[father] > arr[child] )

{

swap(&arr[father],&arr[child]);

father = child;

}

else

{

break;

}

}

}

void BuildHeap_max(HPDataType* arr,int sz)//建立小堆

{

int father = 0;

for( father = (sz - 1 - 1)/2 ; father >= 0 ; father-- )

{

Adjustdown_max(arr , sz , father );

}

}

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <assert.h>

typedef int HPDataType;

typedef struct Heap

{

HPDataType* arr;

int size;

int capacity;

}HP;

void HeapInit(HP* hp);

void HeapPush(HP* hp,HPDataType x);

void HeapPop(HP* hp);

void swap(HPDataType* a , HPDataType* b );

void Adjustup_max(HPDataType* arr , int child );

void Adjustup_min(HPDataType* arr , int child );

void Adjustdown_min(HPDataType* arr , int size , int father);

void Adjustdown_max(HPDataType* arr , int size , int father);

void BuildHeap_min(HPDataType* arr,int sz);

void BuildHeap_max(HPDataType* arr,int sz);

相关推荐
怒放吧德德1 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆3 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
心之语歌5 小时前
基于注解+拦截器的API动态路由实现方案
java·后端
华仔啊6 小时前
Stream 代码越写越难看?JDFrame 让 Java 逻辑回归优雅
java·后端
ray_liang6 小时前
用六边形架构与整洁架构对比是伪命题?
java·架构
AI软著研究员6 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish7 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
Ray Liang8 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
颜酱8 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
Java水解8 小时前
Java 中间件:Dubbo 服务降级(Mock 机制)
java·后端