堆排序

class HeapSort{
    void headAdjust(int[] a,int k,int len){
        a[0] = a[k];//暂存子树的根节点
        for (int i = 2*k; i <= len ; i*=2) {//沿关键字较大的子节点向下筛选
            if (i < len && a[i] <a[i+1])
                i++;//取关键字较大的子节点的下标
            if(a[0] >= a[i])//筛选结束
                break;
            else {
                a[k] = a[i];//将a[i]调整到双亲节点上
                k = i;//修改K值,以便向下筛选
            }
        }
        a[k] =a[0]; //被筛选节点的值放入最终位置
    }
    //建立大根堆
    void buildMaxHead(int[] a,int len){
        for (int i = len/2 ; i>0 ; i--)//从后往前调整分支节点
            headAdjust(a,i,len);
    }
    public void sort(int[] a){
        buildMaxHead(a,a.length-1);//初始建堆
        for (int i = a.length-1; i >1 ; i--) {//n-1趟交换和建堆过程
            int temp = a[i]; //堆底元素和堆顶元素交换
            a[i] = a[1];
            a[1] = temp;
            headAdjust(a,1,i-1);//把剩余待排序的元素建成堆
        }
    }
}
posted @ 2023-02-25 19:53  诸葛卧龙仙人  阅读(28)  评论(0)    收藏  举报