```java
import java.io.*;
import java.util.*;
/**
* 堆排序的思想:先初始化一个大顶堆,在对剩下的元素再使用堆排序。
*
* 注意数组下标从0开始,左孩子就为2*index+1了,总长度n=n-1
*/
public class Heap {
static void sift(int[] R,int low,int high)
{
int i=low,j=2*i+1;
int temp=R[i];
while (j<=high)
{
if(j<high&&R[j]<R[j+1]) //右孩子比左孩子大
{
++j;
}
if(temp<R[j])
{
R[i]=R[j];
//开始下一次轮回,交换的数到下面来了,要继续比较看看是否比下面的数小
i=j;
j=2*i+1;
}
else
{
break;
}
}
R[i] =temp;
}
static void HeadSort(int[] R,int n)
{
int i=0,temp;
for(i=n/2-1;i>=0;i--) //从非叶结点(n/2-1)开始调整
{
sift(R,i,n-1); //初始化一个大顶堆
}
for (i=n-1;i>0;i--)
{
temp=R[i];
R[i]=R[0];//将大顶堆的第一个数(已找到的最大的数),赋值给最后一位
R[0]=temp; //将最后一位重新移动到第一位,只有第一个元素不一定满足大顶堆
sift(R,0,i-1); //长度每次减一。
}
}
public static void main(String[] args)
{
int[] arr={49,38,65,97,76,13,27,49};
HeadSort(arr,arr.length);
System.out.println(Arrays.toString(arr));
}
}