给定k个已经排序的数组,每个数组的长度是n。设计一个算法,把这k个已排序的数组归并成一个排序的数组。
思路是取出k个数组的第一个元素, 建一个最小堆.
然后不断地从堆顶取走元素x, 追加到结果数组中.
在x原来所在数组的下一个元素加到堆里面.
重复过程, 直到k个数组都为空.
=========================================================================================================
外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。
外部排序最常用的算法是多路归并排序,即将原文件分解成多个能够一次性装入内存的部分,分别把每一部分调入内存完成排序。然后,对已经排序的子文件进行多路归并排序。
在看输入法内核代码的时候发现一个对多路归并的应用.
==========================================================================================================
在网上搜多路归并的题目的话, 会看到poj2442
题意是给你一个m*n的矩阵,每一行取一个数求和一共有n^m种可能,然你求出前n小的n个和.
实际解法跟上面说的多路归并算法半毛钱关系没有.
因为如果你真的用多路归并的话, 大概解法就是不断地维护一个最小元素的数组, 这样就可以确定最小和了
但是在确定哪一个要加入堆里面的时候, 你会发现需要对两个列进行完全的比较, 而这样的时间开销是很大的.
实际解法就是分拆出子问题, 递归地先确定n-1路的前n小的和, 然后, 这n路的前n小的和就是n-1路的结果和第n路数据构成.