小根堆排序

小根堆排序

2020-06-21
数据结构

定义 #

节点均小于其左孩子节点和右孩子节点

左孩子节点均小于其左右孩子节点

右孩子节点均小于其左右孩子节点

……

代码实现 #

    public void buildHeap(int[] n,int len){//建立初始堆
        for(int i=len/2;i>=1;i--){
            adjustHeap(n,i,len);
        }
    }

    public void adjustHeap(int[] n,int s,int len){//调整堆
        for(int i=2*s;i<=len;i*=2){
            //如果出现左右孩子节点大于该s节点时,该位置无需调整
            //否则,不仅需要调整该s节点,还需要进行向下调整
            if(i<len&&n[i]>n[i+1])
                i++;
            if(n[s]<n[i])
                break;
            else{
                n[0]=n[i];
                n[i]=n[s];
                n[s]=n[0];
                s=i;
            }
        }
    }

    public void heapSort(int[] n,int len){//堆排序
        for(int i=len;i>1;i--){
            //将堆顶元素与最后一个元素调换位置
            n[0]=n[i];
            n[i]=n[1];
            n[1]=n[0];
            //将未排序的前i-1个元素重新调整为堆
            adjustHeap(n,1,(i-1));
        }
    }

复杂度 #

建立堆的时间复杂度:O(n)

堆排序的时间复杂度:O(nlogn)

空间复杂度:O(1)

不稳定的排序算法