#include"Sort.h"
void exchange(int *a,int *b)
{
*a=*a+*b;
*b=*a-*b;
*a=*a-*b;
}
// 构建最小堆
void BuidMinHeap(int *array,int size)
{
// 定义两个变量
int i;
int j;
// 对每一个元素进行构建最小堆
for(i=2;i<size;i++)
{
// 对当前元素进行构造堆
for(j=i;j>1;j=j/2)
{
// 如果当前节点的值比父节点的值小
if(array[j/2]>array[j])
{
// 交换
exchange(array+j/2,array+j);
}
}
// 继续判断父节点的值(j=j/2)
}
}
// 构建最大堆
void BuidMaxHeap(int *array,int size)
{
// 定义两个变量
int i;
int j;
// 对每一个元素进行构建最大堆
for(i=2;i<size;i++)
{
// 对当前元素进行构造堆
for(j=i;j>1;j=j/2)
{
// 如果当前节点的值比父节点的值大
if(array[j/2]<array[j])
{
// 交换
exchange(array+j/2,array+j);
}
}
// 继续判断父节点的值(j=j/2)
}
}
void MaxHeapify(int *array,int position,int size)
{
// 确定左孩子和右孩子
int left=position*2;
int right=position*2+1;
int max;
// 确定最大值
if(left<size && array[left]>array[position])
{
max=left;
}
else
{
max=position;
}
if(right<size && array[right]>array[max])
{
max=right;
}
// 和最大值交换
if(max!=position)
{
exchange(&array[position],&array[max]);
// 对max最大堆化
MaxHeapify(array,max,size);
}
}
void MinHeapify(int *array,int position,int size)
{
// 确定左孩子和右孩子
int left=position*2;
int right=position*2+1;
int min;
// 确定最小值
if(left<size && array[left]<array[position])
{
min=left;
}
else
{
min=position;
}
if(right<size && array[right]<array[min])
{
min=right;
}
// 和最小值交换
if(min!=position)
{
exchange(&array[position],&array[min]);
// 堆min最小堆化
MinHeapify(array,min,size);
}
}
void BuidMaxHeap2(int *array,int size)
{
int i;
// 对每一个堆进行维护,使成为最大堆
for(i=size/2;i>0;i--)
{
MaxHeapify(array,i,size);
}
}
void BuidMinHeap2(int *array,int size)
{
int i;
// 对每一个堆进行维护,使成为最小堆
for(i=size/2;i>0;i--)
{
MinHeapify(array,i,size);
}
}
void HeapSort(int *array,int size)
{
// 构建最大堆
BuidMaxHeap2(array,size);
// 堆排序
int i;
for(i=size-1;i>1;i--)
{
exchange(array+1,array+i);
MaxHeapify(array,1,i);
}
}
C语言实现堆排序
最新推荐文章于 2023-01-05 00:41:54 发布