程序员

数据结构——优先队列和堆

2018-07-16  本文已影响16人  我哈啊哈啊哈

目录

1、优先队列

1.1、什么是优先队列

1.2、优先队列的实现

2、堆

2.1、什么是堆

2.2、堆的类型

2.3、二叉堆

2.3.1、堆的声明
2.3.2、创建堆
2.3.3、结点的双亲
2.3.4、结点的孩子
2.3.5、获取最大元素
2.3.6、堆化元素
2.3.7、删除元素
2.3.8、插入元素
2.3.9、清空堆
2.3.10、数组建堆
2.3.11、堆排序

正文

1、优先队列

1.1、什么是优先队列

1.2、优先队列的实现

2、堆

2.1、什么是堆

2.2、堆的类型

2.3、二叉堆

2.3.1、堆的声明
/**
 * @Auther: lalala
 * @Date: 2018/7/15 15:08
 * @Description:二叉堆
 */
public class Heap {
    public int[] array;
    public int count;           //堆的元素个数
    public int capaticy;        //堆的大小
    public int heap_type;       //最小堆或最大堆
    public Heap(int capaticy,int heap_type){
        //具体实现如下
    }

    public int Parent(int i){
        //具体实现如下
        return -1;
    }

    public int LeftChild(int i){
        //具体实现如下
        return -1;
    }

    public int RightChild(int i){
        //具体实现如下
        return -1;
    }

    public int GetMaximum(){
        //具体实现如下
        return -1;
    }
}
2.3.2、创建堆
    public Heap(int capaticy,int heap_type){
        this.heap_type=heap_type;
        this.count=0;
        this.capaticy=capaticy;
        this.array=new int[capaticy];
    }
2.3.3、结点的双亲
    public int Parent(int i){
        if(i<=0||i>this.count){
            return -1;
        }
        return (i-1)/2;
    }
2.3.4、结点的孩子
    public int LeftChild(int i){
        int left=2*i+1;
        if(left>this.count){
            return -1;
        }else {
            return left;
        }
    }

    public int RightChild(int i){
        int right=2*i+2;
        if(right>this.count){
            return -1;
        }else {
            return right;
        }
    }
2.3.5、获取最大元素
    public int GetMaximum(){
        if(this.count==0){
            return -1;
        }else {
            return this.array[0];
        }
    }
2.3.6、堆化元素
    public void PercolateDown(int i){
        int l,r,max,temp;
        l=LeftChild(i);
        r=RightChild(i);
        if(l!=-1&&this.array[l]>this.array[i]){
            max=l;
        }else {
            max=i;
        }
        if(r!=-1&&this.array[r]>this.array[max]){
            max=r;
        }
        if(max!=i){
            temp=this.array[i];
            this.array[i]=this.array[max];
            this.array[max]=temp;
        }
        PercolateDown(max);
    }
2.3.7、删除元素
    public int DeleteMax(){
        if(this.count==0){
            return -1;
        }
        int data=this.array[0];
        this.array[0]=this.array[count-1];
        this.count--;
        PercolateDown(0);
        return data;
    }
2.3.8、插入元素
    public int Insert(int data){
        int i;
        if(this.count==this.capaticy){
            ResizeHeap();
        }
        this.count++;
        i=this.count-1;
        while (i>=0&&data>this.array[(i-1)/2]){
            this.array[i]=this.array[(i-1)/2];
            i=(i-1)/2;
        }
        this.array[i]=data;
        return i;
    }

    public void ResizeHeap(){
        int[] array_old=new int[this.capaticy];
        System.arraycopy(this.array,0,array_old,0,this.count-1);
        this.array=new int[this.capaticy*2];
        if(this.array==null){
            return;
        }
        for(int i=0;i<this.capaticy;i++){
            this.array[i]=array_old[i];
        }
        this.capaticy*=2;
        array_old=null;
    }
2.3.9、清空堆
    public void DestroyHeap(){
        this.count=0;
        this.array=null;
    }
2.3.10、数组建堆
    public void BuildHeap(Heap h,int[] A,int n ){
        if(h==null){
            return;
        }
        while (n>h.capaticy){
            h.ResizeHeap();
        }
        for(int i=0;i<n;i++){
            h.array[i]=A[i];
        }
        h.count=n;
        for(int i=(n-1)/2;i>=0;i--){
            h.PercolateDown(i);
        }
    }
2.3.11、堆排序
    public void Heapsort(int[] A,int n){
        Heap h=new Heap(n,0);
        int old_size,i,temp;
        BuildHeap(h,A,n);
        old_size=h.count;
        for(i=n-1;i>0;i--){
            //h.array[0]存储最大元素
            temp=h.array[0];
            h.array[0]=h.array[h.count-1];
            h.count--;
            h.PercolateDown(i);
        }
        h.count=old_size;
    }
上一篇 下一篇

猜你喜欢

热点阅读