堆排序是一种原地的,时间复杂度为$O(n\log n)$。
堆是一种特殊的树,堆是一个完全二叉树,堆中每一个节点的指都必须大于等于(或小于等于)其子树中每个节点的值。
分为“大顶堆”和“小顶堆”。
堆的操作:插入元素,
public class Heap{
private int[] a;
private int n;
private int count;
public Heap(int capcity){
a = new int[capicity + 1];
n = capicity;
count = 0 ;
}
public void insert(int data){
if(coun >=n ) return ;
++count;
a[count] = data;
int i=count;
while(i/2 >0 && a[i]>a[i/2]){
swap(a,i,i/2);
i=i/2;
}
}
}
删除堆顶元素,代码如下:
public void removeMax(){
if (count ==0) return -1;堆中没有数据
a[1] = a[count];
--count;
heapify(a,count,1);
}
private void heapify (int[] a,int n,int i){ //自上往下堆化
while(true){
int maxPos = i;
if(i*2 <=n && a[i] < a[i*2]) maxPos =i*2;
if(i*2+1 <= n && a[maxPos] < a[i*2+1]) maxPos = i*2+1;
if(maxPos == i) break;
swap(a, i, maxPos);
i = maxPos;
}
}