下面的用例调用了IndexMaxPQ的代码MultiWay解决了多项归并问题:它将多个有序的输入流归并成一个有序的输出流。许多应用中都会遇到这个问题。输入可能来自于多种科学仪器的输出(按时间排序),或是来自多个音乐或电影网站的信息列表(按名称或艺术家名字排序),或商家交易(按账号或时间排序),或者其他。
如果有足够的空间,你可以把它们简单地读入一个数组排序,但如果使用了优先队列,无论输入有多长你都可以把它们全部读入并排序。
package xwq.sort;
import xwq.dt.IndexMaxPQ;
import xwq.util.In;
import xwq.util.StdOut;
public class MultiWay {
public static void merge(In[] streams) {
int N = streams.length;
IndexMaxPQ<String > pq = new IndexMaxPQ<String>(N);
for(int i = 0;i < N;i++) {
if(!streams[i].isEmpty())
pq.insert(i, streams[i].readString());
}
while(!pq.isEmpty()) {
StdOut.print(pq.maxKey()+" ");
int i = pq.delMax();
if(!streams[i].isEmpty())
pq.insert(i, streams[i].readString());
}
StdOut.println();
}
public static void main(String[] args) {
int N = args.length;
In[] streams = new In[N];
for (int i = 0; i < N; i++)
streams[i] = new In(args[i]);
merge(streams);
}
}
这段代码调用了IndexMaxPQ来作为命令行参数输入的多行有序字符串归并为一行有序的输出。每个输入流的索引都关联着一个元素(输入中的下个字符串)。
初始化之后,代码进入一个循环,删除并打印出队列中最小的字符串,然后将该输入的下一个字符串添加为一个元素。