1、什么是堆
2、堆排序算法
堆排序(Heap Sort)就是利用堆结构进行排序(假设利用大顶堆),其基本思想是先将待排序的序列构造为一个大顶堆,将其根结点(最大值)提取出来,再将剩下的待排序的子序列重新构造出一个堆,再将新堆的根结点(第二大的值)提取出来。如此反复的重构堆、提取。直到最后一个结点为止。综上所述,只需要解决两个问题,就可以完成堆排序
a、如何将一个无序的序列构造成一个堆?
b、将堆顶提取之后,如何将子序列重构为一个新的堆?
3、C语言实现
#include<stdio.h>
/*交换两个数的值*/
void swap(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
/*大顶堆的重构*/
void HeapAdjust(int *arr,int i,int n)
{
int temp,j;
temp=arr[i];
for(j=i*2; j<=n; j*=2)/*从当前关键字的左右子结点向下筛选*/
{
if(j<n&&arr[j]<arr[j+1])
++j;/*记录较大值的下标*/
if(temp>=arr[j])
break;/*当寻找到合适的插入位置,停止筛选*/
arr[i]=arr[j];
i=j;
}
arr[i]=temp;/*插入关键字*/
}
/*堆排序*/
void HeapSort(int *arr,int n)
{
int i;
for(i=n/2; i>0; i--)/*将待排序的序列构建为一个堆*/
HeapAdjust(arr,i,n);
for(i=n; i>1; i--)
{
swap(arr+1,arr+i);/*将堆顶元素与当前未排序的子序列中的最后一个元素交换*/
HeapAdjust(arr,1,i-1);/*交换后,将未排序的子序列重构为一个合法的堆*/
}
}
int main()
{
int arr[]= {-1,50,20,30,40,10,80,70,90,60};
int i;
HeapSort(arr,9);
for(i=1; i<=9; i++)
printf("%d ",arr[i]);
}