堆就是用数组实现的完全二叉树
大根堆,小根堆
1.大根堆的插入heapinsert O(logN)
2.堆化heapify
应用:将堆中一个数改变,要使改变后仍是堆。如果变小,向下堆化。
3.堆排序
优先级队列结构就是堆
priorityQueue<Integer> heap=new priorityQueue<>();
heap.insert(3);
heap.insert(2);
cout时是小根堆
//大根堆的插入
void heapInsert(int arr[],int i){
while(arr[i]>arr[(i-1)/2]){//当前位置的值大于父节点
swap(arr[i],arr[(i-1)/2]);//交换下标
i=(i-1)/2;//改变位置指向
}
}
//堆化
void heapify(int arr[],int i,int heapsize){
int l=i*2+1;
while(l<heapsize){
int large=l+1<heapsize&&arr[l]>arr[l+1]?l:l+1;
large=arr[large]>arr[i]?large:i;
if(large==i) break;
swap(large,i);
i=large;
l=i*2+1;
}
}