代码如下(Java实现):
public static void heapSort(int[] arr){
System.out.println("堆排序!");
//将一个无序序列构建成一个堆
for(int i=arr.length/2-1;i>=0;i--)
{
adjustHeap(arr,i,arr.length);
}
/*
将堆顶元素与末尾元素交换,将最大元素“沉”到数组末端
重新调整结构,使其满足堆定义,从根节点调整即可,反复执行调整+交换,直至整个序列有序
*/
int temp=0;
for(int j= arr.length-1;j>0;j--)
{
temp=arr[j];
arr[j]=arr[0];
arr[0]=temp;
adjustHeap(arr,0,j);
}
}
/**
* 局部调整大顶堆
* @param arr 待调整的数组
* @param i 非叶子节点在数组中的索引
* @param len 对多少个元素进行调整,是在逐渐减少的
*/
public static void adjustHeap(int[] arr,int i,int len)
{
int temp=arr[i];
/**
* 开始调整
* k指向结点的左子结点
*/
for(int k=2*i+1;k<len;k=2*k+1)
{
if((k+1)<len&&arr[k]<arr[k+1])//比较左右结点的值
{
k++;//指向右子结点
}
if(arr[k]>temp)//大于父结点
{
arr[i]=arr[k];//把较大的值赋给当前结点
i=k;//i指向k,继续循环
}else
{
break;
}
}
//当for循环结束后,已经将最大的值放在了最顶(局部)
arr[i]=temp;//将temp的值放在调整后的位置(交换)
}