Seite 1 von 1

Wie heißt dieser Sortieralgorithmus?

Verfasst: Montag 12. Juli 2010, 03:05
von pillmuncher

Code: Alles auswählen

from collections import deque
from heapq import merge


def XYsort(seq):

    if len(seq) <= 1:
        return seq

    items = iter(seq)
    slist = deque([items.next()])
    ulist = []
    
    for item in items:
        if item < slist[0]:
            slist.appendleft(item)
        elif not item < slist[-1]:
            slist.append(item)
        else:
            ulist.append(item)
    
    return merge(slist, XYsort(ulist))


print list(XYsort([7, 8, 9, 4, 5, 6, 1, 2, 3, 0]))
Wer kann mir sagen, wie er heißt?

Offensichtlich ist er verwandt mit Natural Mergesort, aber doch anders. Die Idee ist, eine zu sortierende Liste in je eine sortierte und eine unsortierte zu splitten, das ganze rekursiv auf die neu gewonnene unsortierte Liste anzuwenden, und das Ergebnis mit der sortierten Liste zu mergen. AFAICS ist er stabil, obwohl ich noch nicht ausgiebig drüber nachgedacht habe, und für verkettete Listen ist er in-place. Best Case ist O(n), Avarage Case ist O(n log n) und Worst Case ist O(n^2), weil dabei pro rekursivem Aufruf nur je zwei Elemente abgezwickt werden, und beim Mergen viele unnütze Vergleiche durchgeführt werden müssen. Man kann ihn aber mit Quicksort kombinieren, dann werden die jeweiligen Worst Cases abgefangen.

Re: Wie heißt dieser Sortieralgorithmus?

Verfasst: Mittwoch 14. Juli 2010, 21:20
von sma
pillmuncher hat geschrieben:Wer kann mir sagen, wie er heißt?
Ich würde sagen, er heißt XYsort ;)

(Sorry, heute ich nicht mein Tag für sinnvolle Antworten, wie es mir scheint)