堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:
大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;
堆排序的平均时间复杂度为 Ο(nlogn)。
- 算法步骤
创建一个堆 H[0……n-1];
把堆首(最大值)和堆尾互换;
把堆的尺寸缩小 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应位置;
重复步骤 2,直到堆的尺寸为 1。
-
动图演示
package sorted;
import java.util.Arrays;
public class HeapSort {
public static void main(String[] args) {
int[] array = {1,999,888,777,6,5,7,3,2,9};
heapSort(array);
System.out.println(Arrays.toString(array));
}
private static void heapSort(int[] array){
int temp;
for(int i= (array.length-1)/2;i>=0;i--){
adjust(array,i, array.length);
}
for(int j= array.length-1;j>0;j--){
temp = array[j];
array[j] = array[0];
array[0] = temp;
adjust(array,0,j);
}
}
private static void adjust(int[] array, int index, int length){
int value = array[index];
for(int i= 2 * index + 1;i<length;i = (2*i)+1){
if (i + 1 < length && array[i] < array[i + 1]) {
i++;
}
if(array[i]>value){
array[index] = array[i];
index = i;
System.out.println(value);
}
else {
break;
}
}
array[index] = value;
}
}