=Paper= {{Paper |id=Vol-414/paper-3 |storemode=property |title=Multiway blockwise in-place merging |pdfUrl=https://ceur-ws.org/Vol-414/paper3.pdf |volume=Vol-414 |dblpUrl=https://dblp.org/rec/conf/itat/GeffertG08 }} ==Multiway blockwise in-place merging== https://ceur-ws.org/Vol-414/paper3.pdf
                             Multiway Blockwise In-place Merging

                                               Viliam Geffert and Jozef Gajdoš

                          Institute of Computer Science, P.J.Šafárik University, Faculty of Science
                                          Jesenná 5, 041 54 Košice, Slovak Republic
                                      viliam.geffert@upjs.sk, jozef.gajdos@upjs.sk

Abstract. We present an algorithm for asymptotically ef-        array A. Moreover, the lengths n1 , . . . , nk of input se-
ficient multiway blockwise in-place merging. Given an ar-       quences are positive integer multiples of s, and hence,
ray A containing sorted subsequences Pk A1 , . . . , Ak of respec-
                                                                there is always a block boundary between the last el-
tive lengths n1 , . . . , nk , where      n = n, we assume
                                      i=1 i                     ement of Ai and the first element of Ai+1 , for each
that extra k·s elements (so called buffer elements) are po-     i ∈ 1, . . . , k−1. We shall also assume, that before the
sitioned at the very end of array A, and that the lengths
                                                                merging starts, blocks can be mixed up quite arbitrar-
n1 , . . . , nk are positive integer multiples of some param-
                                                                ily, so we no longer know the original membership of
eter s (i.e., multiples of a given block of length s). The
number of input sequences k is a fixed constant parameter,      blocks in the input sequences A1 , . . . , Ak .
not dependent on the lengths of input sequences. Then our            So far, the problem has been resolved for two-way
algorithm merges the subsequences A1 , . . . , Ak into a single merging, i.e., for k = 2 [4]. This algorithm uses 2n +
sorted sequence, performing Θ(log k·n) + O((n/s)2 ) + O(s·      o(n) comparisons, 3n + o(n) element moves and O(1)
log s) element comparisons and 3 · n + O(s · log s) element     extra locations for storing elements, in the worst case.
moves.1                                                         Thus, by repeated application of this algorithm, we
Then, for s = dn2/3 /(log n)1/3 e, this gives an algorithm      could carry out k-way merging in linear time, for ar-
performing Θ(log k ·n) + O((n·log n)2/3 ) comparisons and       bitrary k ≥ 2. However, implemented this way, the k-
3·n + O((n·log n)2/3 ) moves. That is, our algorithm runs       way merging would perform 3·dlog ke·n+o(n) element
in linear time, with an asymptotically optimal number of        moves and 2·dlog ke·n+o(n) element comparisons. We
comparisons and with the number of moves independent
                                                                shall show that the number of moves does not depend
on the number of input sequences. Moreover, our algo-
rithm is “almost in-place”, it requires only k extra blocks
                                                                on k, if the lengths n1 , . . . , nk are integer multiples
of size s = o(n).                                               of the block size s. Namely, using the algorithm of
                                                                Geffert et. al [4] as our starting point, we show that
                                                                multiway blockwise in-place merging is possible with
1 Introduction                                                  dlog ke·n + O((n/s)2 ) + O(s·log s) element comparisons
                                                                and 3·n + O(s·log s) moves. For s = dn2/3 /(log n)1/3 e,
                                                                this gives an algorithm with dlog ke·n + O((n·log n)2/3 )
Given an array A[1..n] consisting of sorted subsequen-
                                                                comparisons and 3·n + O((n·log n)2/3 ) moves, and the
ces A1 , . . . , Ak each
                       Pcontaining n1 , . . . , nk elements re-
                         k                                      number of element moves independent on the number
spectively, where i=1 ni = n, the classical multiway
                                                                of input sequences. (It is also easy to show that the
in-place merging problem is to rearrange these ele-
                                                                number of comparisons cannot be improved.)
ments to form a single sorted sequence of n elements,
assuming that only one extra storage location (in ad-
dition to the array A) is available for storing elements. 2 Comparisons in a simple multiway
To store array indices, counters, etc. only O(1) stor-                merging
age locations are available. The efficiency of a merg-
ing algorithm is given by two quantities: the number To explain how elements are compared, we first solve
of pairwise element comparisons and the number of a simpler task. Assume that we are given an array A,
element moves carried out in the worst case, both ex- consisting of k sorted subsequences A1 , A2 , . . . , Ak ,
pressed as a function of n. In merging, these are the that are to be merged into a single sorted sequence.
only operations permitted for elements.                         The lengths of these  P subsequences are n1 , n2 , . . . , nk
     In this paper we study the computational complex- respectively, with k ni = n.
                                                                                         i=1
ity of the multiway blockwise in-place merging prob-                 Assume also that, together with the given array A,
lem. More precisely, we assume that the entire array A we are also given an extra array B of the same size n,
is divided into blocks of equal size s, and that k ex- which will be used as an output zone.
tra blocks of size s are positioned at the very end of
                                                                     During the computation, the algorithm uses aux-
 1
   Throughout the paper, log x denotes the binary loga- iliary index variables i1 , . . . , ik and oc , where ij , for
   rithm of x.                                                  j ∈ {1, . . . , k}, points to the smallest element of the
sequence Aj not yet processed. This element will be                Before passing further, we define the following rel-
called the current input element of the j-th sequence,        ative order of blocks in the array A. Let X be a block
or simply the j-th input element. The index oc points         with the leftmost and the rightmost elements denoted
to the leftmost empty position in the array B.                by xL and xR , respectively. Such block can be repre-
    Then the straightforward implementation of the            sented in the form X = hxL , xR i. Similarly, let Y =
merge routine proceeds as follows. We find the small-         hyL , yR i be an another block. We say that the block X
est element not yet processed, by comparing elements          is smaller than or equal to Y , if xL < yL , or xL = yL
at the positions i1 , . . . , ik , and move this element to   and xR ≤ yR . Otherwise, X is greater than Y . In other
the output zone in B. After that, we update the nec-          words, the blocks are ordered according to their left-
essary index variables and repeat the process until all       most elements and, in the case of equal leftmost el-
the elements have been merged. Implemented this way,          ements, the elements at the rightmost positions are
each element will be moved just once and the number           used as the second order criterion.
of comparisons, per each element, will be k −1. This
gives us (k−1)·n comparisons and n element moves in
total.                                                            Now the modified merging algorithm proceeds as
                                                              follows. First, using the above block ordering, find the
    The number of comparisons can be reduced by im-           smallest k blocks in the array A. These blocks will ini-
plementing a selection tree of depth dlog ke above the        tially become the k current input blocks, their leftmost
k current input elements. Initially, to build a selec-        elements becoming the k current input elements. The
tion tree, k − 1 comparisons are required. Then the           j-th current input block will be denoted by Xj , simi-
smallest element, not yet processed, can be moved to          larly, the j-th current input element by xj . The posi-
the output zone. After this, the element following the        tions of current input elements are kept in index vari-
smallest element in the same subsequence is inserted          ables i1 , . . . , ik . Above the k current input elements,
in the tree and the selection tree is updated. To do          we build a selection tree. All blocks that are not input
this, only dlog ke comparisons are needed. To avoid el-       blocks are called common blocks.
ement moves, only pointers to elements are stored in
                                                               After that, the merging process can proceed in the
the selection tree. (For more details concerning this
                                                           same way as described in Section 2. That is, using
data structure, see [1–3].) The number of moves re-
                                                           the selection tree, determine ij , the position of the
mains unchanged, but now we have k − 1 compar-
                                                           smallest input element not yet processed, among the
isons for the first element and only dlog ke compar-
                                                           k current input elements, and move this element to
isons per each other element. This gives us a total of
                                                           the output zone in the array B. Then the element po-
(k−1) + dlog ke·(n−1) ≤ dlog ke·n + O(1) comparisons.
                                                           sitioned immediately on the right of xj , within the
                                                           same block Xj , becomes a new j-th current input el-
3 Comparisons in a blockwise merging ement, its index pointer is inserted into the selection
                                                           tree, and the tree is updated, with dlog ke compar-
This section describes one of the cardinal tricks used in isons. This can be repeated until one of the current
our algorithm. Again, we are given the array A con- input blocks becomes empty.
sisting of the sorted subsequences A1 , . . . , Ak , to be     When this happens, i.e., each time the element xj ,
merged together. We still have the extra array B, used just moved to the output zone, was the last (right-
as an output zone.                                         most) element in the corresponding input block Xj ,
    However, now the entire array A is divided into the block Xj is “discarded” and the smallest (accord-
blocks of equal size s (the exact value of s will be ing to our relative block ordering) common block not
determined later, so that the number of comparisons yet processed will be used as the new j-th current
and moves is minimized) and, before the merging can input block. The leftmost element in this block will
start, these blocks are mixed up quite arbitrarily. Be- become the new j-th current input element. Since the
cause of the permutation of blocks in A, we no longer blocks are mixed up in the array A, we need to scan
know the original membership of blocks in the input sequentially all blocks (actually, all blocks not yet pro-
sequences A1 , . . . , Ak .                                cessed only) to determine which one of them is the
    Still, the relative order of elements inside individ- smallest. This search for a new input block consumes
ual blocks is preserved. Moreover, we shall also assume O((n/s)2 ) additional comparisons: there are at most
that n1 , . . . , nk , the respective lengths of input se- n/s blocks and such search is activated only if one of
quences, are positive integer multiples of s, and hence, the input blocks has been discarded as empty, i.e., at
before mixing the blocks up, there was always a block most n/s times. (For the time being, just assume that
boundary between the last element of Ai and the first we can distinguish discarded blocks from those not yet
element of Ai+1 , for each i ∈ 1, . . . , k−1.             processed, at no extra cost.)
    However, before merging, the blocks have been mi-               a so-called escape block. We also maintain a current
xed up quite arbitrarily and hence their origin in the              escape position ec , which is initially the position of
input subsequences A1 , . . . , Ak cannot be recovered.             the first (leftmost) element in the escape block. We
The proof that the above algorithm behaves correctly,               create a hole here by putting the buffer element at
that is, the elements are transported to the output                 this position aside.
zone in sorted order, will be published in the full ver-                Now, find the smallest k blocks2 in the area oc-
sion of the paper. (** The proof can also be found in               cupied by A1 , . . . , Ak , according to the relative block
the Appendix for the Program Committee. **)                         ordering defined in Section 3. This can be done with
   The number of element moves remains unchanged,                   O(k 2 ) ≤ O(1) comparisons, by the use of some k cur-
but now we use dlog ke · n + O((n/s)2 ) comparisons,                sors (index variables) moving along in A, since each
under assumption that we can distinguish discarded                  of the sequences A1 , . . . , Ak is sorted. The smallest k
blocks from those not yet processed at no extra cost.               blocks will initially become the k current input blocks
                                                                    X1 , . . . , Xk . For each j = 1, . . . , k, the first element xj
                                                                    in the block Xj becomes a j-th current input element,
4     In-place merging, simplified case                             and its position is kept in the index variable ij . Above
                                                                    the k input elements, we build a selection tree of depth
Now we shall convert the above merging algorithm                    dlog ke. To do that, k −1 ≤ O(1) initial comparisons
into a procedure working “almost” in-place. More pre-               are needed.
cisely, we are again given the array A containing the                   The very first block of the array A becomes an
sorted subsequences    Pk A1 , . . . , Ak , of respective lengths   output block and a position oc = 1 pointing there
n1 , . . . , nk , with  i=1 ni = n. All these lengths are           becomes a current output position. The initial out-
positive integer multiples of the given parameter s.                put position may — quite likely — coincide with a po-
     However, we no longer have a separate array B of               sition of some current input element. Observe that
size n. Instead, we have some extra k·s elements po-                ec mod s = oc mod s, which is an invariant we shall
sitioned at the very end of the array A, behind Ak .                keep in the course of the entire computation. All other
The elements in this small additional area are greater              blocks are called common blocks.
than any of the elements in A1 , . . . , Ak . During the
computation, they can be mixed with other elements,
but their original contents cannot be destroyed. These                    In general, the algorithm maintains current posi-
elements will be called buffer elements. To let the el-             tions of the following special blocks: free blocks, the
ements ever move, we have also one extra location                   number of which ranges between 0 and k, their left-
where we can put a single element aside.                            most positions are stored in the free block stack; ex-
     The sorted output should be formed within the                  actly k input blocks, the current input positions inside
same array A, in the locations occupied by the input                the respective blocks are stored in the index variables
sequences A1 , . . . , Ak . (As a consequence, the buffer el-       i1 , . . . , ik ; one output block with the current output
ements should also end up in their original locations.)             position oc inside this block; and one escape block with
Therefore, the moves are performed in a different way,              the current escape position ec inside. The values of oc
based on the idea of internal buffering, used in a two-             and ec are synchronized modulo s.
way in-place merging [4]. Nevertheless, the compar-                     Usually, the optional free blocks, the k current in-
isons are performed in the same way as described in                 put blocks, the output block, and the escape block are
Section 3.                                                          all disjoint, and the merging proceeds as described in
                                                                    Section 4.2. However, after the initiation, the output
                                                                    block may overlay one of the current input blocks, if
4.1    Initiation
                                                                    the leftmost block in A1 has been selected as an in-
Divide the entire array A into blocks of equal size s.              put block. If this happens, the current output position
Since the lengths of all input sequences A1 , . . . , Ak are        coincides with a position of one of the current input
positive integer multiples of s, there is always a block            elements, and the computation starts in a very special
boundary between the last element of Ai and the first               mode of Section 4.9.
element of Ai+1 , for each i ∈ 1, . . . , k−1. Similarly,
the buffer elements, positioned in the small additional             2
                                                                        Picking simply the leftmost blocks in the sequences
area at the very end, form the last k blocks.                           A1 , . . . , Ak would do no harm. In addition, this would
    Initially, the last k blocks will be used as free blocks,           not require any initial element comparisons. However,
their starting positions are stored in a free block stack               we are presenting the algorithm in a form that is suitable
of height k. After that, the position of one free block                 for application in the general case, comparing elements
is picked out of the stack and this block is used as                    in accordance with the strategy presented in Section 3.
4.2     Standard situation                                                                                                                                                                           Step B. The smallest input element xj not yet pro-
                                                                                                                                                                                                        cessed is moved from the position ij to its final
The standard situation is illustrated by Fig. 1. Dur-                                                                                                                                                   position at oc .
ing the computation, the k·s buffer elements can be                                                                                                                                                  Step C. A new hole is created at the position ec +1 by
found at the following locations: to the left of the j-                                                                                                                                                 moving its buffer element to the place released by
th input element xj in the j-th input block Xj , for                                                                                                                                                    the smallest input element just moved. After that,
j ∈ {1, . . . , k}, to the right of ec in the escape block,                                                                                                                                             all necessary index variables are incremented and
with the hole at the position ec , and also in free blocks,                                                                                                                                             the selection tree is updated.
consisting of buffer elements only.
   The elements merged already, from all the input                                                                                                                                                  This gives 3 moves and dlog ke comparisons per each
blocks, form a contiguous output zone at the very be-                                                                                                                                               element transported to its final location. Now there
ginning of A, ending at position oc −1. Hence, the next                                                                                                                                             are various special cases that should be detected and
element to be output will go to the position oc in the                                                                                                                                              handled with care. All exceptions are checked up on
output block.                                                                                                                                                                                       after the execution of Step B, in the order of their
   All elements not merged yet are scattered in blocks                                                                                                                                              appearance, unless stated otherwise. Most of the ex-
between the output zone and the end of the array A.                                                                                                                                                 ception handling routines replace Step C by a different
The permutation of these blocks is allowed, however,                                                                                                                                                action.
elements to be merged keep their relative positions
within each block. On the other hand, the origin of
the blocks in the subsequences A1 , . . . , Ak cannot be                                                                                                                                            4.3   Escape block becomes full
recovered. So optional free blocks, input blocks, es-
cape block, and common blocks can reside anywhere                                                                                                                                                   If the rightmost element of the output block is moved
between the output zone and the end of the array A.                                                                                                                                                 to the last position of the escape block, the new hole
                                                                                                                                                                                                    cannot be created at the position ec +1 in Step C.
                                                                                                                                                                                                    Instead, one free block at the top of the stack becomes
                                                                                                                                                                                                    the new escape block and a new hole is created at
                                                                                                                                             k-th input block




                                                                                                                                                                                                    the beginning of this block. This is accomplished by
                                             i-th input block
                              common block




                                                                             common block

                                                                                            j-th input block



                                                                                                                              common block




                                                                                                                                                                common block

                                                                                                                                                                               common block
                                                                                                               escape block
               output block




                                                                                                                                                                                                    removing its starting position from the free block stack
                                                                free block




                                                                                                                                                                                                    and assigning it to ec .
                                                                                                                                                                                                        The subsequent move of the buffer element from
                                                                                                                                                                                                    the new position of ec to the place released by the
      output
                                                                                                                                                                                                    smallest input element does not increase the number
       zone                                                                                                                                                                                   ...
                                                                                                                                                                                                    of moves; it replaces the move in Step C. The selection
                 oc                              xi                                                   xj          ec                         xk                                                     tree is updated in the standard way.
                                                                                                                                                                                                         It should be pointed out that, at this moment,
                                                                                                                                                                                                    there does exist at least one free block in the stack. As-
                                    Fig. 1. Standard situation
                                                                                                                                                                                                    sume, for example, that the j-th input element xj has
                                                                                                                                                                                                    just been transported to the output zone. After that,
    The output block spans across the current output                                                                                                                                                we have rj ∈ {1, . . . , s} buffer elements in the j-th in-
position oc , so its left part belongs to the output zone.                                                                                                                                          put block Xj , including the hole, but rh ∈ {0, . . . , s−1}
As the output grows to the right, the elements lying                                                                                                                                                buffer elements in other input blocks Xh , for each
to the right of oc are moved from the output block to                                                                                                                                               h ∈ {1, . . . , k}, h 6= j, since each input block, except
the corresponding positions in the escape block, i.e.,                                                                                                                                              for Xj , contains at least one input element. Moreover,
to the right of ec . The positions of oc and ec are syn-                                                                                                                                            the escape block is full, and hence it does not contain
chronized, i.e., we have always oc mod s = ec mod s.                                                                                                                                                any buffer elements at all. Assuming there is no free
Hence, the relative positions of escaping elements are                                                                                                                                              block available, this gives at most s + (k−1)·(s−1) <
preserved within the blocks. Moreover, oc and ec reach                                                                                                                                              k · s buffer elements in total. But this is a contradic-
their respective block boundaries at the same time.                                                                                                                                                 tion, since the number of buffer elements, including
                                                                                                                                                                                                    the hole, is always equal to k·s.
    Now we are ready for merging. Using the selection
tree, we determine xj , the smallest element among the
k current input elements in the blocks X1 , . . . , Xk , and 4.4 Current input block becomes empty
move this element to the output zone as follows:
                                                             We check next whether the smallest element xj , just
 Step A. The element at the position oc in the output moved from the position ij to the output zone, was
    block escapes to the hole at the position ec .           the last element of the corresponding input block Xj .
If so, we have an entire block consisting of buffer el-             4.5   One of the input blocks overlays the
ements only, with hole at the end after Step B. This                      escape block
hole is filled in the standard way, described in Step C,
                                                                    If the common block that should be processed next
but the old input block Xj becomes a free block and
                                                                    is the logical block composed of the left part of the
its starting position is saved in the stack. Since we
                                                                    escape block and the right part of the output block,
have k·s buffer elements in total, a stack of height k
                                                                    then both the new current input block Xj and the es-
is sufficient.
                                                                    cape block are located within the same physical block.
                                                                    Here xj is always positioned to the left of ec and the
    Next, we have to find a new j-th input block Xj ,               buffer elements are both to the left of xj and to the
and assign a new value to ij . Since the blocks are                 right of ec .
mixed up, we scan sequentially the remaining com-                       Once the position of xj is properly initiated, all
mon blocks to determine which common block should                   actions are performed in the standard way described in
become the new j-th current input block. The smallest               Section 4.2. That is, the elements are transported from
common block, according to the block ordering intro-                the output block to the position of ec , from the input
duced in Section 3, is the next one to be processed.                blocks to the position of oc , and buffer elements from
As already shown in Section 3, the elements are trans-              ec +1 to locations released in the input blocks. Since ec
ported to the output zone in sorted order even though               moves to the right “faster” than does ij , this special
this strategy does not necessarily pick up the j-th in-             case returns automatically to the standard mode as
put block from the j-th input sequence Aj .                         soon as ec reaches a block boundary. Then the escape
    Free blocks, as well as all remaining current input             block separates from the current input block Xj as
blocks, are ignored in this scanning. Moreover, the el-             described in Section 4.3.
ements to the left of ec in the escape block (if not
empty) together with the elements to the right of oc in             4.6   Output block overlays the escape block
the output block are viewed as a single logical block. In
a practical implementation, we can start with the left- Next we check whether the output zone, crossing a
most escape-block element and the rightmost output-     block boundary, does not bump into any “special”
block element as a starting key and search the rest     block. It is easy to see that this may happen only if
of the array for a common block with a smaller key.3    ec points to the beginning of the escape block that is
If the logical block composed of the left part of the   empty, using the fact that the positions of oc and ec
escape block and the right part of the output block     are synchronized and that the special handling of Sec-
should be processed next, the program control will be   tion 4.3 is performed first.
switched to the mode described in Section 4.5.              Now consider that the output block overlays the
                                                        escape block, i.e., they are both located within the
    If the escape block is empty, then both ec and oc same physical block. In this mode, we always have
point to the beginning of their respective blocks. Then o = e . The element movement corresponds now to a
                                                         c     c
the escape block is skipped and the output block is more efficient scheme:
handled as a common block, so we may even find out
that the new input block should be located at the same Step B’. The smallest input element xj not yet pro-
position as the output block. This special mode is ex-      cessed is moved to the hole at the position oc = ec .
plained in Section 4.9.                                  Step C’. A new hole is created at the position oc+1 =
    The search for new input blocks costs O((n/s)2 )        ec + 1 by moving its buffer element to the place
additional comparisons: there are O(n/s) blocks in          released by xj . Then all necessary index variables
total and such search is activated only if one of the       are  incremented and the selection tree is updated.
input blocks is exhausted, i.e., at most O(n/s) times. Step A is eliminated, since oc = ec . This mode is ter-
The same upper bound holds for arithmetic operations minated as soon as oc and ec reach a block boundary.
with indexes as well.                                        We also need a slightly modified version of the routine
                                                             described in Section 4.4. If one of the input blocks be-
 3                                                           comes empty, it becomes free as usual, but the com-
   It is quite straightforward to detect whether a block be-
                                                             bined output/escape block is skipped in the search for
   ginning at a given position ` is common: the value of `
   must not be saved in the free block stack, and b`/sc must the next input block.
  be different from bi1 /sc, . . . , bik /sc (excluding bij /sc),
  and also from bec /sc. For each given block, this can             4.7   Output block overlays a free block
  be verified in O(k) ≤ O(1) time, performing auxiliary
  arithmetic operations with indexes only, but no element           If the output zone crosses a block boundary and the
  comparisons or moves.                                             value of oc is equal to some f` , the leftmost position of
a block stored in the free block stack, the new output         tion 4.4, the combined output/escape block is not
block and the corresponding free block are overlaid.           disposed of as free, moreover, it is skipped out dur-
This can be verified in O(k) ≤ O(1) time. By the same          ing the search. The program control is switched to
argument as in Section 4.6, we have that ec must point         the mode of Section 4.6 as the output and escape
to the beginning of an empty escape block.                     blocks are still overlaid.
    Therefore, we can easily swap the free block with (2) Let us now consider that this combined block be-
the escape block by swapping the pointers stored in            comes full. This may happen only if, for some
f` and ec , since both these blocks contain buffer ele-        h 6= j, an element xh from another input block Xh
ments only. Second, one move suffices to transport the         is moved to the output zone and, after Step B’, the
hole from one block to another. Note that this element         output position oc “bumps” into xj . In this case,
move is for free, we actually save some moves because          we take one free block from the top of the stack
the next s transports to the output zone will require          and change it into a new escape block. We defi-
only 2s moves, instead of 3s as in the standard case.          nitely have at least one free block available, since
Thus, the program control is switched to the mode              we disposed one block as free at the very beginning
described in Section 4.6.                                      of this mode. The hole, located in Xh at the posi-
                                                               tion of the last element transported to the output,
4.8 Output block overlays a current input                      jumps to a position ec in the new escape block,
       block                                                   so that ec mod s = oc mod s. This move replaces
                                                               Step C’ for the last element just merged. Hence, it
If the output position oc points to some Xj after cross-       does not increase the total number of moves. Then
ing a block boundary, the output block overlays the j-         we follow the instructions of Section 4.9.
th input block Xj . Again, by the argument presented
in Section 4.6, oc can point to the beginning of an
input block only if ec points to the beginning of an 4.9 Output zone bumps into a current input
empty escape block. There are now two cases to con-               element
sider.
    First, if the j-th current input element xj is the The program control can jump to this special mode
leftmost element of Xj , the program control is switch- from several different places (Sections 4.1, 4.4, and two
ed immediately to the special mode to be described in different places in Section 4.8). In any case, we have an
Section 4.9.                                               empty escape block, containing the hole and buffer ele-
    Second, if xj is not the leftmost element of Xj , we ments only. The output block and a block Xj , which is
dispose of the empty escape block as free by storing one of the input blocks, are overlaid. Moreover, there
its starting position ec in the stack, create a hole at oc is no room in between, the output position oc is point-
by moving a single buffer element from the position oc ing to the current input element xj . The position of
to ec , and overlay the output block by a new escape hole in the escape block is synchronized with oc , i.e.,
block, by assigning the value of oc to ec . The additional we have ec mod s = oc mod s.
transportation of the hole is for free, not increasing the     As long as the elements to be output are selected in
total number of moves, because we can charge it as         the input block Xj , they can be moved to the output
(nonexistent) Step A for the next element that will be     zone.  This needs no actual transportation, just the
transported to the output zone. Since xj is not placed     positions  of oc and ij are moved synchronously to the
at the beginning of the block, we can guarantee that       right. To  keep ec synchronized with oc , we move the
at least one transport to the output will use only two     hole along  the escape block in parallel, which gives us
moves in the next future.                                  one  move  per  element. There are two ways out of this
    This special mode can be viewed as if three blocks     loop.
were overlaid, namely, the output, escape, and the cur-
                                                           (1) If oc and ij reach the block boundary, we sim-
rent input block Xj . The buffer elements are between
                                                               ply search for the next input block to be pro-
the hole at ec = oc and the current input element xj .
                                                               cessed; the current configuration is the same as
The elements are moved according to Step B’ and
                                                               if, in the standard mode, oc , ec , and ij reached
Step C’ of Section 4.6. However, there is a different
                                                               the block boundaries at the same time (with the
exception handling here.
                                                               old input block Xj disposed of as free, by Sec-
(1) If the rightmost input element of this combined            tion 4.4). Thus, unless something “exceptional”
     block has been transported to the output zone,            happens, the program control returns to the stan-
     then the input block Xj separates from the out-           dard mode. (The possible exceptions are those dis-
     put/escape block, since we search for the next in-        cussed in Sections 4.6–4.8, and 4.10.) The single
     put block to be processed. But here, unlike in Sec-       move required to place the hole back to the begin-
    ning of the escape block is for free, it substitutes          sists of the subsequences A1 , . . . , Ak merged into a sin-
    Step C for the last element merged.                           gle sorted sequence, followed by a sorted sequence of
(2) If the element to be transported to the output zone           buffer elements.
    is an element xh from another input block Xh ,
    for some h 6= j, some rearrangements are neces-
                                                                  4.11    Summary
    sary. Recall that the hole position ec in the es-
    cape block is synchronized with oc , i.e., we have            Summing up the costs paid for maintaining the se-
    ec mod s = oc mod s. First, the input element xj              lection tree, transporting the elements to the output
    is moved from position oc to position ec . Now we             zone, searching for smallest input blocks, and for sort-
    can transport xh to the output position oc . Fi-              ing the residual zone, it is easy to see that the above
    nally, a new hole is created4 at the position ec +1           algorithm uses dlog ke·n + O((n/s)2 ) + O(s·log s) el-
    by moving its buffer element to the place released            ement comparisons and 3 · n + O(s · log s) moves. For
    by xh .                                                       s = dn2/3 /(log n)1/3 e, this gives an algorithm with
    The result is that the current input block Xj , over-         dlog ke · n + O((n · log n)2/3 ) comparisons and 3 · n +
    laid by the output block, jumps and overlays the              O((n·log n)2/3 ) moves.
    escape block. Thus, the control is switched to the
    mode of Section 4.5.
    Clearly, this rearrangement needs only three mo-              5    Conclusion
    ves. Since one more element has been transported
    to the output zone, the number of moves is the                In this paper we have shown that k-way blockwise
    same as in the standard case.                                 in-place merging can be accomplished efficiently with
                                                                  almost optimal number of element comparisons and
                                                                  moves. Moreover, the number of element moves is in-
4.10     Common blocks are exhausted                              dependent on k, the number of input sequences. Note
                                                                  that this algorithm does not merge stably, that is, the
If one of the current input blocks becomes empty, but
                                                                  relative order of equal elements may not be preserved.
there is no common block to become a new input
                                                                  Whether there exist a stable multiway blockwise in-
block, the above procedure is stopped. At this point,
                                                                  place merging algorithm is left as an open problem.
the output zone, consisting of the elements merged al-
                                                                      We conjecture that, using the algorithm described
ready in their final locations, is followed by a residual
                                                                  here as a subroutine, it is possible to devise an asymp-
zone of size n0 starting at the position oc . This zone
                                                                  totically efficient multiway in-place merging algorithm.
consists of the right part of the output block, k−1 un-
                                                                  We dare to formulate this conjecture since the work on
merged input blocks, at most k free blocks, and one
                                                                  such algorithm is currently in progress.
escape block. Thus, the total length of this residual
zone is n0 ≤ s + (k−1)·s + k·s + s = (2k+1)·s.
    The residual zone can be sorted by the use of Heap-           References
sort (including also the buffer element put aside at the
very beginning of the computation, to create a hole).             1. Katajainen, J., Pasanen, T.: In-Place Sorting with
This will cost only O(k·s·log(k·s)) ≤ O(s·log s) com-                Fewer Moves. Inform. Process. Lett. 70 (1999) 31–37
parisons and the same number of moves [5–9]. Alterna-             2. Katajainen, J., Pasanen, T., Teuhola, J.: Practical In-
tively, we could also use an algorithm sorting in-place              Place Mergesort. Nordic J. Comput. 3 (1996) 27–40
with O(s·log s) comparisons but only O(s) moves [10].             3. Katajainen, J., Träff, J. L.: A Meticulous Analysis of
    Now we are done: the buffer elements are greater                 Mergesort Programs. Lect. Notes Comput. Sci. 1203
than any other element, and hence the array now con-                 (1997) 217–28
                                                                  4. Geffert, V., Katajainen, J., Pasanen, T.: Asymptotically
4
    Unless the position ec +1 itself is across the block bound-      Efficient In-Place Merging. Theoret. Comput. Sci. 237
    ary. If xj is moved to the rightmost position in the escape      (2000) 159–81
    block, the escape block jumps immediately and one free        5. Carlsson, S.: A Note on Heapsort. Comput. J. 35 (1992)
    block becomes a new escape block. This nested excep-             410–11
    tion thus returns the algorithm to the standard mode; all     6. Knuth, D. E.: The Art of Computer Programming,
    “special” blocks now reside in pairwise disjoint regions.        Vol. 3: Sorting and Searching. Addison-Wesley, Second
    However, we jump to the point where the standard rou-            edition (1998)
    tine checks the exceptions of Sections 4.4–4.10. Among        7. Schaffer, R., Sedgewick, R.: The Analysis of Heapsort.
    others, we have to check whether the input block Xh              J. Algorithms 15 (1993) 76–100
    has not become empty, or if the output zone, just cross-      8. Wegener, I.: Bottom-Up-Heapsort, a New Variant of
    ing a block boundary, has not bumped into any other              Heapsort Beating, on an Average, Quicksort (If n Is Not
    “special” block again.                                           Very Small). Theoret. Comput. Sci. 118 (1993) 81–98
9. Williams, J. W. J.: Heapsort (Algorithm 232). Comm.        Appendix for the Program Committee
   Assoc. Comput. Mach. 7 (1964) 347–48
10. Franceschini, G., Geffert, V.: An In-Place Sorting with   In this appendix, we give a proof of correctness of the
   O(n·log n) Comparisons and O(n) Moves. J. Assoc.
                                                              blockwise merging algorithm described in Section 3.
   Comput. Mach. 52 (2005) 515–37
                                                                   Recall that the algorithm starts with the smallest
                                                              k blocks of the array A and, each time one of the k in-
                                                              put blocks becomes empty, the smallest common block
                                                              not yet processed becomes the new input block, not
                                                              taking into account its origin in one of the sequences
                                                              A1 , . . . , Ak .
                                                                   Let us assume, for contradiction, that an element
                                                              xC has just been transported to the output zone, but
                                                              there still exists an unprocessed element y, such that
                                                              y < xC . Clearly, the element xC was a current input
                                                              element in some current input block. Originally, this
                                                              input block was represented in the form X = hxL , xR i,
                                                              which gave its relative block order. Here xL repre-
                                                              sents the original leftmost element of X (transported
                                                              to the output even earlier than xC ) and xR the right-
                                                              most element (still residing in X). Since all blocks are
                                                              sorted, we have that xL ≤ xC ≤ xR (not excluding
                                                              the possibility that xC coincides with xL or xR ). Simi-
                                                              larly, the element y resides in a block characterized by
                                                              Y = hyL , yR i, with yL ≤ y ≤ yR . (The current status of
                                                              the original leftmost element yL is not known: it can
                                                              still reside in Y but, potentially, it may be a part of
                                                              the output zone already.) Now there are the following
                                                              possibilities to consider:
                                                                  (a) The block Y is one of the current input blocks
                                                              (not excluding the possibility that Y coincides with X).
                                                              This case is straightforward. Let yC denotes the cur-
                                                              rent input element in the input block Y . Clearly, yC ≤
                                                              y, since y has not been processed yet. But then yC ≤
                                                              y < xC , that is, yC < xC , which is a contradiction,
                                                              since xC has just been moved to the output, and hence
                                                              determined to be the smallest one among all current
                                                              input elements.
                                                                  (b) The block Y is one of the common blocks (not
                                                              yet being processed) and, at the present moment, all
                                                              k current input blocks have their origin in different
                                                              input sequences A1 , . . . , Ak . This does not necessarily
                                                              mean that the i-th input block Xi originated from Ai ,
                                                              since it could have its origin in a different sequence.
                                                              Nevertheless, this does imply that one current input
                                                              block Z ∈ {X1 , . . . , Xk } originated from the same se-
                                                              quence A` as did the block Y .
                                                                  Let Z = hzL , zR i represents the original character-
                                                              ization of this current input block, and let zC be its
                                                              current input element. Clearly, zL ≤ zC ≤ zR . Using
                                                              the fact that the block Z has been selected as an in-
                                                              put block prior to selecting the block Y = hyL , yR i, and
                                                              that these two blocks originated from the same sorted
                                                              sequence A` , we have that zR ≤ yL . (For, if zR > yL ,
                                                              the sequence A` could not be sorted.) But this gives
that zC ≤ zR ≤ yL ≤ y < xC . Therefore, zC < xC ,
which is a contradiction, since the element xC has been
determined to be the smallest one among all current
input elements.
    (c) Finally, let Y be one of the common blocks
and, at the present moment, at least two current in-
put blocks have their origin in the same input se-
quence. That is, we have V, W ∈ {X1 , . . . , Xk }, com-
ing from A` , for some ` ∈ {1, . . . , k}. Let the respective
characterizations of these two blocks be V = hvL , vR i
and W = hwL , wR i, their respective current input ele-
ments be vC and wC . Clearly, vL ≤ vC ≤ vR and wL ≤
wC ≤ wR . Without loss of generality, we can also as-
sume that the block V was smaller than or equal to W .
But then vR ≤ wL , since these two blocks came from
the same sorted sequence A` . Moreover, at the present
moment, the element xC has just been selected as the
smallest one from among all current input elements,
and hence we also have that xC ≤ vC . Putting these
facts together, we get yL ≤ y < xC ≤ vC ≤ vR ≤ wL .
Therefore, yL < wL , which contradicts the fact that
the block W had been selected as an input block prior
to selecting the block Y .
    Summing up, all cases have led us to contradic-
tions, and hence the elements are always transported
to the output zone in sorted order.5




5
    Notice that the algorithm would behave correctly even if
    the number of used current input blocks exceeded k, the
    number of original input sequences. This only eliminates
    Case (b) in the proof of correctness.