堆排序是一个原地排序算法,虽然在排序中用的更多的是快速排序,但堆排序有一个很常见的应用:作为高效的优先级队列。
下面我将列举跟堆排序相关的C代码,C代码主要是根据《Introduction to Algorithms》(《算法导论》)中的伪代码写的。
操作基本是围绕最大堆进行的,最小堆的情况只要进行少量改动即可
(1)堆的几个基本操作
inline int Parents(int i){return i>>1;} //获得父结点
inline int Left(int i){return i<<1;} //获得左子结点
inline int Right(int i){return (i<<1+1);} //获得右子结点。
(2)保持堆性质的子程序
/*保持最大堆性质*/
void MaxHeapify(int* arr,int i,int length)
{
int maxLable=i;
int left=Left(i);
int right=Right(i);
if(right<length && arr[right]>arr[maxLable])
{
maxLable=right;
}
if(left<length && arr[left]>arr[maxLable])
{
maxLable=left;
}
if(maxLable!=i)
{
int temp=arr[i];
arr[i]=arr[maxLable];
arr[maxLable]=temp;
MaxHeapify(arr,maxLable,length);
}
}
void BuildMaxHeap(int* arr,int length)
{
if(length<=0 && arr==NULL)return;
for(int i=(length-1)>>1;i>=0;i--)MaxHeapify(arr,i,length);
}
(4)堆排序
排序是升序的。
void HeapSort(int* arr,int length)
{
if(arr==NULL && length<=0)return;
BuildMaxHeap(arr,length);
int heapSize=length;
for(int i=length;i>=0;i--)
{
int temp=arr[i];
arr[i]=arr[0];
arr[0]=temp;
heapSize--;
MaxHeapify(arr,0,heapSize);
}
}