创建最大(小)堆用于排序 实际上最大(小)堆是一只平衡二叉树 最大堆则任意父节点值大于子节点 最小堆反之 从小到大排序用最大堆 反之
排序原理是用堆顶与最右叶子结点互换 并断开最右叶子节点 叶子节点输出 整棵树调整之后重复操作 直至结束
---C语言实现
---实现为小堆排序
#include<stdio.h>
#include<stdlib.h>
//遍历数组
void LoopForArr(int arr[],int length)
{
int count;
if(arr == NULL || length <=0)return ;
for(count = 0;count<length;count++)
{
printf("%d ",arr[count]);
}
printf("\n");
}
//建造堆(小)
void AjustHeap(int arr[],int Start,int End)
{
int count;
//调整
for(count = Start*2+1;count<=End;count = count*2+1)
{
if(Start*2+2<=End && arr[Start*2+2]<arr[count])
{
count = Start*2+2;
}
if(arr[count]<arr[Start])
{
arr[count]^=arr[Start]^=arr[count]^=arr[Start];
Start = count;
}
else
{
break;
}
}
}
//排序过程
void heapSort(int arr[],int length)
{
int count;
for(count = length-1;count>0;count--)
{
arr[0]^=arr[count]^=arr[0]^=arr[count];
AjustHeap(arr,0,count-1);
}
}
//堆排序 :小堆
void HeapSort(int arr[],int length)
{
int count;
if(arr == NULL || length <=0)return ;
//默认数组建树完成 调整
for(count = length/2-1;count>=0;count--)
{
AjustHeap(arr,count,length-1);
}
//排序过程
heapSort(arr,length);
}
int main()
{
int arr[] = {22,34,1,6,9,123,55,78,12,4,56,87,52};
HeapSort(arr,sizeof(arr)/sizeof(arr[0]));
LoopForArr(arr,sizeof(arr)/sizeof(arr[0]));
system("pause");
return 0;
}