算法(4)-堆-JAVA
堆,逻辑上是一个完全二叉树,实现是一个数组。时间复杂度O(N*logN)。二叉树的高度就决定了O(logn)这个结论。
堆两个操作:1.heapInsert() 加一个新值到堆里 ,值与父比,如果大则交换位置。
2.heapify() 减一个最大的值
//arr[0...index-1]已经是堆 index是新加数的下标
//index 数与父比较,>父,与父交换
void heapInsert(int[]arr,int index)
{
while(arr[index]>arr[(index-1)/2])// 加入的值>父值 交换 子 i 父 (i-1)/2
{
swap(arr,index,(index-1)/2);//父子交换值
index=(index-1)/2; //下标更改
}
}
//删最大值
//1.堆最后一个数放头
//2.有效区个数-1
//3.头向下调整 当前为父 与两子比较
void heapify(int[] arr,int index,int heapSize)
{
int left=index*2+1;
while(left<heapSize)//左孩子不越界 下方还有孩子
{ //左右孩子谁大 谁给largest
int largest=left+1<heapSize && arr[left+1]>arr[left]
//右孩子 不越界 右>左
?left+1//右
:left;//左
//父亲和孩子谁大,把下标给largest
largest=arr[largest]>arr[index]?largest:index;
//largest是自己不用往下沉
if(largest==index)
{break;}
swap(arr,largest,index);
index=largest;//来到下方
left=index*2+1;//找右孩子
}
}
swap(int[]arr,int i,int j)
{
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}

浙公网安备 33010602011771号