二叉树的顺序结构及实现以及堆排序

二叉树的顺序结构及实现,其核心是public void AdjustDown(int root, int len) 方法;TextHeap 类中的很多其他方法基本都是通过调用此方法实现的,包括堆排序也是通过调用AdjustDown方法实现的。当然initHeap()方法同样也是比较重要的,第一次调用此方法对堆进行初始化,创建一个大根堆。之后才会有其他方法,此结构的实现都是在这是个大根堆的基础上进行的。


public interface Heap {
    //向下调整
    void AdjustDown(int root,int len);
    //初始化建立大根堆
    void initHeap(int[] array);
    //向上调整,从孩子节点开始调整
    void AdjustUp(int child,int len);
    // 插入 item 到堆中
    void pushHeap(int item);
    // 返回堆顶元素,删除数据元素
    int popHeap();
    // 返回堆顶元素,不删除数据元素
    int getHeapTop();
    //堆排序
    void HeapSort();
    //打印堆
    void show();

}

//二叉树的顺序结构及实现
import Interface.Heap;

import java.util.Arrays;

public class TextHeap  implements Heap {
    private int[] elem;
    private int usedSize;
    private static final int DEFAULT_SIZE  = 10;
    public TextHeap(){
        this.elem = new int[DEFAULT_SIZE];
        this.usedSize = 0;
    }
    @Override
    public void AdjustDown(int root, int len) {
        int parent = root;
        int child = 2*parent+1;
        while(child < len){
            if(child+1<len&&elem[child]<elem[child+1]){
                ++child;
            }
            //child存放的是左右孩子的最大值
            if(elem[child]>elem[parent]){
                //交换
                int temp = elem[child];
                elem[child] = elem[parent];
                elem[parent] = temp;
                parent = child;
                child = 2*parent+1;
            }else{
                break;
            }
        }
    }
//创建一个大根堆
/*
子推父:子:n  父:(n-1)/2
父推子: 父:n  子: (2n+1),(2n+2)
 */
    @Override
    public void initHeap(int[] array) {
        for(int i = 0;i<array.length;i++){
            this.elem[i] = array[i];
            this.usedSize++;
        }

        for(int i = (array.length-1-1)/2;i >= 0;i--){
            AdjustDown(i,this.usedSize);
        }
    }
//向上调整
    @Override
    public void AdjustUp(int child, int len) {
        int parent = (child-1)/2;
        while(child > 0){
            if(elem[child]<elem[parent]){
                break;
            }else{
                int temp = elem[child];
               elem[child] = elem[parent];
               elem[parent] = temp;
            }
            child = parent;
            parent = (child-1)/2;
        }
    }

    public boolean isFll(){
        return this.elem.length>=this.usedSize;
    }
// 插入 item 到堆中
    @Override
    public void pushHeap(int item) {
        if(isFll()){
           this.elem = Arrays.copyOf(this.elem,this.elem.length*2);
        }
        this.elem[this.usedSize] = item;
        this.usedSize++;
        AdjustUp(this.usedSize-1,this.usedSize);
    }
    public boolean isEmpty(){
        return this.usedSize == 0;
    }
// 返回堆顶元素,删除数据元素
    @Override
    public int popHeap() {
        if(isEmpty()){
            throw new UnsupportedOperationException("空堆");
        }
        int oldData = elem[0];
        elem[0] = elem[usedSize - 1];
        elem[usedSize - 1] = elem[0];
        this.usedSize--;
        AdjustDown(0,this.usedSize);
        return oldData;
    }
 // 返回堆顶元素,不删除数据元素
     @Override
    public int getHeapTop() {
         if(isEmpty()){
             throw new UnsupportedOperationException("空堆");
         }
        return elem[0];
    }
    //堆排序
    /*
    时间复杂度:O(n *log  2n)
    空间复杂度O(1);
    稳定性:不稳定
     */
    @Override
    public void  HeapSort() {
        int end = this.usedSize - 1;
        while(end > 0){
            int temp =  this.elem[0];
            elem[0] = elem[end];
            elem[end] = temp;
            AdjustDown(0,end);
            end--;
        }
    }

    @Override
    public void show() {
        for(int i =0;i<this.usedSize;i++){
            System.out.print(elem[i]+" ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        TextHeap textHeap = new TextHeap();
        int[] array = new int[]{1,2,3,4,5,6,7,8,9,0};
        textHeap.initHeap(array);
        textHeap.show();
        textHeap.AdjustDown(1,10);
        textHeap.show();
        textHeap.pushHeap(11);
        textHeap.show();
        textHeap.popHeap();
        textHeap.show();
        textHeap.HeapSort();
        textHeap.show();
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值