按照小根堆调整应该是:结果是从大到小的。
package com.wjy.renren;
import java.util.Arrays;
public class HeapSort {
public static void main(String args[]){
//int[] array={9, 8, 3, 6, 2,8,5};
int[] array={0,6,9,3,8,2,8,5};
heapSort(array);
System.err.println(Arrays.toString(array));
}
/**
* 对于小根堆,每次调整之后顶层元素一定是这个树中最小的元素,
* 所以可以和最后一个叶子节点交换,将这个叶子节点交换上去而自己实际上已经不再树里了,
* 最后得到的数组从后向前遍历就是元素值从小到大的顺序。最小的在数组的最后一个,因为他是第一个被
* 置换到队尾的。次小的元素被换到队尾,并不是和那个最小的元素交换而是和无序的队列中的队尾交换,
* 这样一来就换到了倒数第二个。以此类推。每完成一次堆的调整,无序队列长度-1,有序长度从后到前
* 长度加1。
* @param array
*/
private static void heapSort(int[] array){
int n=array.length;
for(int i=n-1;i>1;i--){
adjustHeap(array, i);
array[i]^=array[1];
array[1]^=array[i];
array[i]^=array[1];
}
}
private static void adjustHeap(int[] array,int end){
int n=end,pos=0;//pos用来记录最小的那个。
for(int j=n-1;j>=1;j--){
if(2*j<=n){//至少有左孩子
if((2*j+1)<=n){//有右孩子
if(array[2*j]>array[2*j+1]){//左孩子大
pos=2*j+1;
}else{
pos=2*j;
}
}else{//只有左孩子
pos=2*j;
}
if(array[j]<array[pos]){//父节点最小
continue;
}else {
array[j]^=array[pos];
array[pos]^=array[j];
array[j]^=array[pos];
}
}
}
}
}
堆排序的思想,是首先按照二叉树建堆:
然后堆顶元素和最后一个元素互换,输出最后一个元素。重新调整堆。