Problem

3 /7


Zusammenführen sortieren

Theory Click to read/hide

Mischung
Algorithm wurde erfunden.John von Neuman1945.
Klassische Idee
(1) Wir nehmen die Masse. Wenn es aus einem Element besteht, ist es bereits vervierfacht.
(2) Sind die Elemente größer als eins, brechen wir das Volumen in zwei gleiche Teile (genau zu einem) und trennen jedes Teil durch den gleichen Algorithmus.
(3) Als nächstes, "Boden" alle gestreuten Teile in eine Masse.
Wie stellen Sie alle Teile in einem Satz?
  1. Wir behalten die Indizes des Beginns der beiden fragmentierten Teile.
  2. Erstellen Sie eine neue Liste wie folgt:
    1. der beiden Elemente, die durch die Indizes angegeben werden, werden wir eine kleinere auswählen und in die neue Liste eintragen;
    2. Wir werden den Index verschieben, den wir zum nächsten Element der Liste genommen haben;
    3. Wenn die Elemente in einem der schwimmenden Teile fertig sind, werden wir die Elemente des zweiten zum Ende der letzten Liste hinzufügen.
  3. Die identifizierte Liste sollte in den Schiebeteilen platziert werden.
Pseudocod von Fusionsalgorithmus
Die Funktion entlädt zwei Teile der Massea[left;mid)und[mid;right)
FUNCTION merge(a, links, Mitte, rechts) // a - mass, size n; links, Mitte, rechts - ganze Zahlen, Indizes von Elementen des Körpers
= 0
= 0
Ergebnis: int[rechts - links] /

POCA links + it1 buoy mid und mid + it2 buoyancy rechts
EPPLE a[left + it1] RO a[mid + it2]
Ergebnis[it1 + it2] = a[links + it1]
It1 +=1
INAT
Ergebnis[it1 + it2] = a[mid + it2]
It2 +=1

POCA links + it1 Etat Mitte
Ergebnis[it1 + it2] = a[links + it1]
It1 +=1

PIC Mitte + it2 PER rechts
Ergebnis[it1 + it2] = a[mid + it2]
It2 +=1

Für i OT 0 DA it1 + it2
a[left + i] = Ergebnis[i]

VERIFIZIERUNG eine

Fusionsalgorithmus
Die Funktion beschneidet den Teilabschnitt der Masse mit Halbwertsindizes[left; right)
FUNCTION mergeSortRecursive(a, links, rechts) // a - masse, links, rechts - Indizes halb gefragt für Sortierung
wenn links + 1 Grad = rechts
VERIFIZIERUNG eine
Mitte = (links + rechts) / 2
mergeSortRecursive(a, links, Mitte)
mergeSortRecursive(a, Mitte, rechts)
fusion(a, links, Mitte, rechts)
VERIFIZIERUNG eine

Fusionsalgorithmus
Iteralgorithmus verwendet O(logn) weniger Erinnerung, die an die Herausforderung gewöhnt war.
FUNCTION mergeSortIterative(a, n) // a - Masse; n = Masselänge
Für i OT 1 bis n, SIG i *= 2
Für j OT 0 bis n - i, SAS j += 2 * i
Zusammenführung(a, j, j + i, min(j + 2 * i, n)
VERIFIZIERUNG eine
Arbeitszeit
Um die Zeit der Arbeit zu schätzen, machen wir ein Rivalen-Verhältnis.
Lass mich los! T(n) - Längenverkleidung n, dann zu Fusionszwecken ist es fair:
T(n) = 2T(n/2)+O(n)
O(n)- die Zeit benötigt, um zwei Längen zu vergießen n
Wir unterzeichnen dieses Verhältnis:
T(n) = 2T(n/2) + О(n) = 4T(n/4) + 2O(n) = ... = T(1) + log(n)O(n) = O(nlog(n))
Komplexität des AlgorithmusO(nlog(n))
Zusätzliche Materialien
(1) MischungITMO Viki Conspects.

Problem

Sortieren Sie dieses Array mit Mergesort.


Eingabe
Die erste Zeile der Eingabe enthält die Anzahl der Elemente im Array NN <= 105 . Als nächstes kommt N Ganzzahlen, deren absoluter Wert 109 nicht übersteigt.


Impressum
Drucken Sie diese Nummern in nicht absteigender Reihenfolge.
 
Beispiele
# Eingabe Ausgabe
1 2
3 1
1 3