堆排序原理:将待排序的数组构造成一个大顶锥,整个数组的最大值就是堆顶的根节点。将她移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个元素重新构造成一个堆,这样就会得到n个元素中的次大值,如此反复,便能得到有序数组了。
//第一个for循环是将待排序数组构建成一个大顶锥
//第二个for循环是将每个最大值的根节点(就是第一个元素)与末尾元素交换,然后再调整其成为大顶锥
//数组第一个元素不是要比较的元素,但可以是数组的元素数。
public static void heapSort(int []arr)
{
int i;
for(i=(arr.length-1)/2;i>0;i--) i从第一个非叶节点开始
heapAdjust(arr,i,arr.length-1);
for(i=arr.length-1;i>1;i--)
{
swap(arr,1,i);
heapAdjust(arr,1,i-1);
}
}
//将每个非叶子节点当做根节点,把其和其子树调整成大顶锥
// h是对应的小顶点,m是对应的最后一个元素。
private static void heapAdjust(int[] arr, int h, int m) {
int temp=arr[h];
for(int j=2*h;j<=m;j*=2)
{
if(j<m&&arr[j]<arr[j+1])
++j; // j是两者中较大值的下标
if(temp>=arr[j])
break;
arr[h]=arr[j];
h=j;
}
arr[h]=temp;
}