堆排序(Heap Sort)算法是基于选择排序思想的,其利用堆结构和二叉树的一些性质来完成数据的排序。堆排序在某些场合具有广泛的应用。
堆排序过程
一个完整的堆排序需要经过反复的两个步骤:构造堆结构和堆排序输出。
- 构造堆结构就是把原始的无序数据按照堆结构的定义调整,将无序数据放置到一个完全二叉树中,然后由完全二叉树的下层逐渐进行父节点数据的比较,是父节点数据大于左右子节点的数据,直到所有节点都满足条件位置。
- 堆排序输出:构造堆结构后根节点的数据即为数组数据最大值,然后将根节点数据与最后一个子节点数据交换输出根结点数据,在进行构造堆结构过程有得到一个最大值,反复交换数据与构造堆结构,最终完成所有数据排序。
代码如下:
public class HeapSort {
public static void main(String[] args) {
int a[]={23,15,24,36,46,37,75,66};
heapSort(a);
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
private static void heapSort(int[] a) {
int[] b=new int[a.length];
if(a==null||a.length<=1)return;
buildHeap(a);//构造堆结构
for(int i=a.length-1;i>=1;i--){
exchangeData(a, i, 0);
maxHeap(a,i,0);
}
}
private static void buildHeap(int[] a) {
int half=a.length/2;
for(int i=half;i>=0;i--){
maxHeap(a,a.length,i);
}
}
private static void maxHeap(int[] a, int length, int i) {
int left=i*2+1;//左子树节点
int right=i*2+2;//右子树节点
int largest=i;
if(left<length&&a[left]>a[i]){
largest=left;
}
if(right<length&&a[right]>a[largest]){
largest=right;
}
if(largest!=i){
exchangeData(a,largest,i);//交换数据,使父节点数据大于子节点
maxHeap(a,length,largest);//重新构造堆结构
}
}
private static void exchangeData(int[] a, int index1, int index2) {
int temp;
temp=a[index1];
a[index1]=a[index2];
a[index2]=temp;
}
}