排升序要建大堆;排降序要建小堆
基本原理:也是选择排序,只是不在使用遍历的方式查找无序区间的最大的数,而是通过堆来选择无序区间的最大的
数
实现:升序
从小到大排序,先建立一个大根堆,
将堆顶元素和未排序的最后一个元素交换,向下调整
依次进行交换,调整
public void heapSort(int[] array) {
for (int i = (array.length - 1 - 1) / 2; i >= 0; i--) {
adjustDown(array, i, array.length );
}
int end = array.length - 1;
while (end > 0) {
int tmp = array[0];
array[0] = array[end];
array[end] = tmp;
adjustDown(array, 0, end);//adjustDown (len 不包括最后一个 左闭右开区间
end--;
}
}
public void adjustDown(int[] array,int root,int len){
int parent = root;
int child = 2*parent+1;
while (child<len){
if(child+1<len&&array[child]<array[child+1]){
child = child +1;
}
if(array[child]>array[parent]){
int tmp = array[child];
array[child] = array[parent];
array[parent] = tmp;
parent = child;
child = 2*parent+1;
}else {
break;
}
}
}