算法(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;
}

 

posted @ 2020-02-05 09:57  jasmineTang  阅读(53)  评论(0)    收藏  举报