第二章--优先队列

news/2024/5/19 6:47:30 标签: 堆排序, 数据结构, 算法, java
public class Test04 {
    /**
     * 堆是一种数据结构,一般采用完全二叉树的形式实现(堆一定是完全二叉树,完全二叉树不一定是堆,
     * 注意区分完全二叉树和排序二叉树),队列是线性表的一种,线性表属于线性结构,     树是树形结构。堆是一种线性表。   
*优先队列通常用堆来实现,而堆有两个性质,一,子节点总是不大于或者不小于父节点,二,堆总是一棵完全二叉树。
     * @param v1
     * @param w1
     * @return
     */

    public static boolean less(Comparable v1,Comparable w1){
        int v=Integer.parseInt((String)v1);
        int w=Integer.parseInt((String)w1);
        if (v<w)
            return true;
        else
            return false;
    }

    public static void exch(Comparable[] a,int i,int j){
        Comparable t =a[i];
        a[i]=a[j];
        a[j]=t;
    }
    public static void sink(Comparable[] pq,int k,int N){
        //pq数组第一个元素为null,所以数组中的索引值与元素位置对应(即堆中第一个数字索引为1而不是0)
       // int N=pq.length;
        //下面这个while循环,如果不减一(原书上未减一),那么数组有16个元素时,第八个元素小于等于16,那么迭代时会有角标越界。
        while (2*k<=N-1){
            int j=2*k;
            //堆上面的元素与下面两个元素中较大元素换位置
            if (j<=N&&less(pq[j],pq[j+1])){
                j++;
            }
            //堆上面的元素大于下面的元素则停止
            if (!less(pq[k],pq[j])){
                break;
            }
            exch(pq,k,j);
            k=j;
          //  N--;

        }
    }
    public static void sort(Comparable[]comparables){
        int N=comparables.length;
        for (int k=N/2;k>=1;k--){
        //这个for循环用于构建完全二叉树
            sink(comparables,k,N);
        }
        int M=N-1;
        while(M>3){
        //把上浮的元素排到最后,即可排序
            exch(comparables,1,M);

            M=M-1;
            sink(comparables,1,M);
        }
        exch(comparables,1,M);
    }
    public static void main(String[] args) {
        String[] a = {null,"3", "2", "4", "1", "6", "5", "10", "9", "8", "7","13","11","12","14","15"};
 
        sort(a);
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);

        }
    }
}

 


http://www.niftyadmin.cn/n/1489934.html

相关文章

第三章--基于链表的符号表

public class ST <Key,Value> {/*** 利用链表来存储符号表。这里的Node采用头插法创建&#xff0c;我在原有基础上创建了一个print方法。*/Node first;public class Node {Key key;Value val;Node next;public Node(Key key, Value val, Node next) {this.key key;this.…

CyclicBarrier(循环栅栏)的工作原理及实例

一&#xff1a;CyclicBarrier的工作原理 CyclicBarrier 和 CountDownLatch 非常类似&#xff0c;它也可以实现线程间的技术等待&#xff0c;但是它的功能比 CountDownLatch 更加复杂和强大。主要应用场景和 CountDownLatch 类似。 CyclicBarrier 的字面意思是可循环使用&…

老姐结婚啦。

这几天回了一趟家&#xff0c;老姐结婚啦&#xff0c;转眼间老姐都结婚啦&#xff0c;时间过的好快啊&#xff0c;感慨时间如白驹过隙&#xff0c;总在不经意间就溜走了&#xff0c;珍惜当下&#xff0c;努力前行。

第三章--基于数组的符号表

public class BinarySearchST<Key extends Comparable<Key>,Value> {/*** 利用两数组来存key和value&#xff0c;其中&#xff0c;key数组是有序的&#xff0c;rank方法可查出某个的key对应的value*/private Key[]keys;private Value[]values;private int N;public…

idea整合scala环境搭建和入门HelloWorld

一&#xff1a;Scala开发环境的搭建 首先到Scala官网下载Scala网址为 https://www.scala-lang.org/download/ 找到下图所示位置&#xff1a;选择相对应的版本的Scala进行下载&#xff0c;这里以window为例&#xff1a; 下载完成后安装Scala&#xff0c;这里一路Next即可。 - S…

第三章--2-3查找树及其红黑树实现

算法 一书中&#xff0c;先介绍2-3查找树&#xff0c;随后利用红黑树对其进行实现&#xff08;红链接连接两个2-节点形成3-节点&#xff0c;而黑链接则是2-3查找树中的普通链接&#xff09;&#xff0c;类中主要定义了三种方法&#xff0c;左旋&#xff0c;右旋和变色&#xff…

Spark集群环境的搭建

一&#xff1a;Hadoop集群环境的搭建 hadoop集群环境的安装请参考我之前的博客&#xff1a; 博客地址&#xff1a;https://blog.csdn.net/qq_37469055/article/details/84405238 二&#xff1a;scala环境的搭建 tar -zxvf scala-2.11.4.tgz 修改/etc/profile文件 export S…

第三章--拉链法散列表

public class SeparateChainingHashST<Key, Value> {/*** 这是拉链法散列表&#xff0c;同时利用了第三章最开始使用的链表实现的符号表。* 使用数组的索引来表示符号表的key&#xff0c;为了解决key过大而导致的数组过大问题&#xff0c;利用hash方法对key进行处理&…