Sort one sequence by O(n) in time and O(1) in space

Chris Angelico rosuav at gmail.com
Sun Feb 9 13:39:39 CET 2014


On Sun, Feb 9, 2014 at 11:13 PM, Wesley <nispray at gmail.com> wrote:
> here is input sequence like a1,a2,...,an,b1,b2,...,bn ,the ax and bx always exist in pair. So, now, how to change the sequence to a1,b1,...,an,bn, with time complexity as O(n) and space as O(1).

The two halves of the list are already sorted, yes? Then you don't
need a sort operation, just a zip.

def flip_list(lst):
    offset = len(lst)//2
    for i in range(offset):
        yield lst[i]
        yield lst[i+offset]

start = ['a1','a2','a3','a4','b1','b2','b3','b4']
result = list(flip_list(start))
print(result)

Alternatively, you could arrange this as some kind of swap operation,
modifying the list in place, but I think the more Pythonic way will be
to create a new list. Note that, with the function defined as I have
above, you can iterate over the flipped list without actually
coalescing it in memory. That gives effective O(1) space, and it's
definitely O(n) time as it simply iterates over the whole list once.

ChrisA



More information about the Python-list mailing list