美文网首页
算法读书笔记-排序算法-优先队列

算法读书笔记-排序算法-优先队列

作者: Hurtck | 来源:发表于2017-01-21 19:55 被阅读0次

优先队列是一种抽象数据类型,它表示了一组值和对这些值的操作,它可以让我们每次从中取出权重最大的值.

优先队列的实现

初级实现

数组实现(有序)
在insert的时候对数组排按照权值好序,push只要拿掉最后一个数.
数组实现(无需)
在push时取出全职最大(或最小)的值,insert直接拿最后一个数

二叉堆实现

用数组表示二叉数(若n为根节点则2n和2n+1为它的两个子节点),插入时将它放到最后一个位置,然后上浮(swim)。取出时将它的根节点取出然后把最后一个一个值放到根节点下沉(sink)

上浮的实现
    /*
     * 从k开始,由下至上的堆有序化
     */
    public void swim(int k){
        while(k<1&&less(k/2,k)){
            exch(k,k/2);
            k = k/2;
        }
    }
下沉的实现
    /*
     * 从k开始自上而下的堆有序化
     */
    public void sink(int k,int N){
        while(2*k<=N){
            int j = 2*k;
            if(j<N&&less(j,j+1)) j++;//找出左右子树中较大的值
            if(!less(k, j)) break;//如果它的子树最大值比它大就退出循环
            exch(j, k);
            k=j;
        }
    }
基于堆实现的优先队列
public class MaxPQ<Key extends Comparable<Key>>{
    private Key[] pq;
    private int N = 0;
    
    public void MaxPQ(int maxN){
        pq = (Key[])new Comparable[maxN+1];
    }
    public boolean isEmpty(){return N==0;}
    
    public int size(){return N;}
    
    public void insert(Key v){
        pq[++N] = v;
        swim(N);
    }
    
    public Key delMax(){
        Key max = pq[1];
        exch(1,N--);
        pq[N+1] = null;
        sink(1);
        return max;
    }
    
    /*
     * 从k开始,由下至上的堆有序化
     */
    public void swim(int k){
        while(k<1&&less(k/2,k)){
            exch(k,k/2);
            k = k/2;
        }
    }
    /*
     * 从k开始自上而下的堆有序化
     */
    public void sink(int k){
        while(2*k<=N){
            int j = 2*k;
            if(j<N&&less(j,j+1)) j++;//找出左右子树中较大的值
            if(!less(k, j)) break;//如果它的子树最大值比它大就退出循环
            exch(j, k);
            k=j;
        }
    }
    
    public static void exch(int i,int j){int temp = i;i = j; j = temp;}//需要改写
    public static boolean less(int v,int w){return v<w? true:false;}//需要改写
}

堆排序

主要思想:利用堆的上浮和下沉可以有序化堆实现数组有序的摆放

public static void sort(Comparable[] a){
        int N = a.length;
        for(int k = N/2;k>=1;k--)//将大数沉到最下面
            sink(a,k,N);
        while(N>1){
            exch(a,1,N--);//将最上面的数和最下面的数交换
            sink(a,1,N);//将最上面的数下沉,重构数组
        }
    }

相关文章

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

  • 排序算法

    什么是算法 书籍推荐 《数据结构与算法分析》 表、栈和队列 树 散列(hash) 优先队列(堆) 排序 定义 问题...

  • 算法读书笔记-排序算法-优先队列

    优先队列是一种抽象数据类型,它表示了一组值和对这些值的操作,它可以让我们每次从中取出权重最大的值. 优先队列的实现...

  • MySql性能(9)- mysql的order by的工作原理

    全字段排序 rowid排序 全字段排序和rowid排序3.1 联合索引优化3.2 覆盖索引优化 优先队列算法 优化...

  • 堆排序

    优先队列可以用于花费 时间的排序,基于该想法的算法叫作堆排序(heapsort),该算法的运行时间很优秀,然后,在...

  • 堆排序学习总结

    本文摘抄总结于《算法》 我们可以把任意优先队列变成一种排序方法。而优先队列有多种实现方式,如无序数组实现的最小优先...

  • 《算法》-排序[优先队列(堆排序)]

    优先队列(堆排序) 优先队列:最重要的操作就是删除最大元素和插入元素 堆排序:堆排序对于记录较少的文件效果一般,对...

  • 算法汇总

    关于算法: 基础技巧:分治、二分、贪心排序算法:快速排序、归并排序、计数排序搜索算法:回溯、递归、深度优先遍历,广...

  • 算法与数据结构简介

    0x01 算法 基础技巧:分治、二分、贪心 排序算法:快速排序、归并排序、计数排序 搜索算法:回溯、递归、深度优先...

  • 如何在javascript中使用优先级队列

    摘要:学习优先级队列很重要,因为它被用于许多算法中,例如 Dijkstra 的最短路径算法使用优先级队列。 介绍先...

网友评论

      本文标题:算法读书笔记-排序算法-优先队列

      本文链接:https://www.haomeiwen.com/subject/bdlnbttx.html