Interaktive Demo

Crumsort-Visualisierung

Crumsort von Igor van den Hoven ist ein sehr schneller In-place-Sortieralgorithmus. Seine Fulcrum-Partition nimmt das Pivot aus dem Array und füllt die entstandene Lücke dann immer wieder von beiden Enden, das braucht weniger Schreibzugriffe als Tauschen.

Dein Browser unterstützt das HTML5-Canvas-Element nicht.

Achte auf die Lücke: Sie springt zwischen dem linken und dem rechten Ende hin und her. Mit „Wenige verschiedene Werte“ siehst du, dass Crumsort nicht stabil ist.

Ablauf

Vergleiche
0
Schreibzugriffe
0

Array

Legende

  • Element
  • Pivot (aus dem Array genommen)
  • ≤ Pivot
  • > Pivot
  • Endgültige Position

Laufzeit und Eigenschaften

Bester Fall

O(n)

Seine Analyse erkennt sortierte und umgekehrte Eingaben mit n Vergleichen.

Mittlerer Fall

O(n log n)

Partitioniert wie Quicksort, dank der Fulcrum-Partition mit weniger Schreibzugriffen.

Schlechtester Fall

O(n log n)

Sehr ungleiche Partitionen wechseln zu Quadsort, einem Mergesort.

Zusätzlicher Speicher

O(log n)

Ein fester Puffer von 512 Elementen, dazu der Rekursionsstapel.

Stabil

Nein

Das Füllen von Lücken von beiden Enden ändert die Reihenfolge gleicher Elemente.

In-place

Ja

Die Partition füllt nur Lücken innerhalb des Arrays.

n ist die Anzahl der Elemente. O(n log n) ist das Beste, was ein Sortierverfahren auf Basis von Vergleichen erreichen kann.

Im Vergleich mit den anderen Sortieralgorithmen

AlgorithmusBester FallMittlerer FallSchlechtester FallZusätzlicher SpeicherStabilIn-place
BubblesortO(n)O(n²)O(n²)O(1)JaJa
SelectionsortO(n²)O(n²)O(n²)O(1)NeinJa
InsertionsortO(n)O(n²)O(n²)O(1)JaJa
ShellsortO(n log n)≈ O(n1.25)O(n1.5)O(1)NeinJa
TreesortO(n log n)O(n log n)O(n²)O(n)JaNein
TournamentsortO(n log n)O(n log n)O(n log n)O(n)JaNein
HeapsortO(n log n)O(n log n)O(n log n)O(1)NeinJa
SmoothsortO(n)O(n log n)O(n log n)O(1)NeinJa
MergesortO(n log n)O(n log n)O(n log n)O(n)JaNein
PatiencesortO(n)O(n log n)O(n log n)O(n)JaNein
TimsortO(n)O(n log n)O(n log n)O(n)JaNein
BlocksortO(n)O(n log n)O(n log n)O(1)JaJa
QuicksortO(n log n)O(n log n)O(n²)O(log n)NeinJa
IntrosortO(n log n)O(n log n)O(n log n)O(log n)NeinJa
FluxsortO(n)O(n log n)O(n log n)O(n)JaNein
Crumsort diese SeiteO(n)O(n log n)O(n log n)O(log n)NeinJa

1. Analysieren und Pivot wählen

Wie Fluxsort prüft Crumsort zuerst, ob das Array sortiert oder umgekehrt ist. Dann wählt er ein Pivot, hier den Median aus erstem, mittlerem und letztem Element.

2. Die Fulcrum-Partition

Das Pivot wird herausgenommen, am linken Ende entsteht eine Lücke. Von rechts wandert das erste Element ≤ Pivot in diese Lücke, dadurch entsteht rechts eine Lücke. Von links füllt sie das erste Element > Pivot und so weiter, bis sich beide Enden treffen und das Pivot die letzte Lücke füllt.

3. Hier vereinfacht

Diese Visualisierung nutzt eine Lücke von einem Element, wie die Referenzversion im README. Das Original verschiebt 32 Elemente in einen kleinen Zwischenspeicher, um sie ohne Verzweigungen zu vergleichen, nimmt den Pseudomedian aus 9 und sortiert Teile unter 24 Elementen mit Quadsort.

Quellen

  • Crumsort stammt von Igor van den Hoven. Die Partition auf dieser Seite folgt der Referenz-Fulcrum-Partition aus seinem README, vereinfacht wie oben beschrieben; das Original findest du unter github.com/scandum/crumsort.