• 《算法》第二章部分程序 part 5


    ▶ 书中第二章部分程序,加上自己补充的代码,包括利用优先队列进行多路归并和堆排序

    ● 利用优先队列进行多路归并

     1 package package01;
     2 
     3 import edu.princeton.cs.algs4.IndexMinPQ;
     4 import edu.princeton.cs.algs4.In;
     5 import edu.princeton.cs.algs4.StdOut;
     6 
     7 public class class01
     8 {
     9     private class01() {}
    10 
    11     private static void merge(In[] streams)
    12     {
    13         int n = streams.length;
    14         IndexMinPQ<String> pq = new IndexMinPQ<String>(n);
    15         for (int i = 0; i < n; i++)                     // 初始化队列,每个流输入一个元素
    16         {
    17             if (!streams[i].isEmpty())
    18                 pq.insert(i, streams[i].readString());
    19         }
    20         for (;!pq.isEmpty();)
    21         {
    22             StdOut.print(pq.minKey() + " ");            // 每当输出来自某个流的元素,就从该流插入一个元素
    23             int i = pq.delMin();
    24             if (!streams[i].isEmpty())
    25                 pq.insert(i, streams[i].readString());
    26         }
    27         StdOut.println();
    28     }
    29 
    30     public static void main(String[] args)
    31     {
    32         int n = args.length;
    33         In[] streams = new In[n];                       // 初始化输入流,输入多个文件
    34         for (int i = 0; i < n; i++)
    35             streams[i] = new In(args[i]);
    36         merge(streams);
    37     }
    38 }

    ● 堆排序

     1 package package01;
     2 
     3 import edu.princeton.cs.algs4.StdIn;
     4 import edu.princeton.cs.algs4.StdOut;
     5 
     6 public class class01
     7 {
     8     private class01() {}
     9 
    10     public static void sort(Comparable[] pq)
    11     {
    12         int n = pq.length;
    13         for (int k = n / 2; k >= 1; k--)  // 建堆
    14             sink(pq, k, n);
    15         for (; n > 1;)                    // 每次将最大元素交换到最后,重新调整前面的部分
    16         {
    17             exch(pq, 1, n--);
    18             sink(pq, 1, n);
    19         }
    20     }
    21 
    22     private static void sink(Comparable[] pq, int k, int n)
    23     {
    24         for (int j = k << 1; j <= n; exch(pq, k, j), k = j, j = k << 1)
    25         {
    26             if (j < n && less(pq, j, j + 1))
    27                 j++;
    28             if (!less(pq, k, j))
    29                 break;
    30         }
    31     }
    32 
    33     private static boolean less(Comparable[] pq, int i, int j)
    34     {
    35         return pq[i - 1].compareTo(pq[j - 1]) < 0;
    36     }
    37 
    38     private static void exch(Object[] pq, int i, int j)
    39     {
    40         Object swap = pq[i - 1];
    41         pq[i - 1] = pq[j - 1];
    42         pq[j - 1] = swap;
    43     }
    44 
    45     private static void show(Comparable[] a)
    46     {
    47         for (int i = 0; i < a.length; i++)
    48             StdOut.println(a[i]);
    49     }
    50 
    51     public static void main(String[] args)
    52     {
    53         String[] a = StdIn.readAllStrings();
    54         class01.sort(a);
    55         show(a);
    56     }
    57 }
  • 相关阅读:
    防窜货下加密锁使用常见问题
    SQL Server 2000/2005/2008 触发器的管理和查看
    列表显示时,部分凭证会分两行显示,且不能删除
    JDBC 连接 带实例名的SQL Server
    登录软件提示:读取数据源出现错误,pkcs7填充无效,无法被移除
    完美卸载SQL Server 2008的方案
    彻底卸载(删除)SQL server2000
    NCV5取消:授权数到达,或者许可证过期提示的秘诀
    SQL Server日志清空方法 .
    第二天 一列布局
  • 原文地址:https://www.cnblogs.com/cuancuancuanhao/p/9777869.html
Copyright © 2020-2023  润新知