Bucket-Sort-Algorithmus (Java, Python, C/C++ Code Beispiele)

โšก Intelligente Zusammenfassung

Bucket Sort verteilt die Eingabeelemente auf mehrere Buckets, sortiert jeden Bucket unabhรคngig und sammelt sie anschlieรŸend zu einem endgรผltigen sortierten Array zusammen.

  • ๐Ÿชฃ Kernidee: Bucket Sort teilt die Werte auf mehrere Buckets auf, sortiert jeden Bucket und fรผgt sie dann der Reihe nach zusammen.
  • ๐Ÿ“Š beste Passform: Bucket Sort eignet sich am besten fรผr gleichmรครŸig verteilte Gleitkommazahlen im Intervall [0.0, 1.0] oder gleichmรครŸig verteilte ganze Zahlen.
  • โšก Zeitliche Komplexitรคt: Im Durchschnitt und im besten Fall betrรคgt die Laufzeit lineare O(n+k); im schlechtesten Fall verschlechtert sie sich auf O(nยฒ).
  • โœ… Vorteile: Buckets kรถnnen parallel verarbeitet werden und eignen sich daher fรผr die externe Sortierung groรŸer Datensรคtze.
  • ๐Ÿงช Implementierung: Code in C, C++, Python und Java Zeigt sowohl Gleitkomma- als auch Ganzzahlvarianten.

Was ist Bucket Sort?

Bucket Sort, oft auch Bin Sort genannt, ist ein vergleichsbasiertes Sortierverfahren, das ein unsortiertes Array als Eingabe erhรคlt und ein sortiertes Array als Ausgabe erzeugt. Dabei werden die Elemente in mehrere Behรคlter (Buckets) aufgeteilt und jeder Behรคlter einzeln mithilfe eines anderen Sortieralgorithmus, wie beispielsweise Insertion Sort, sortiert. AnschlieรŸend werden alle Behรคlter zusammengefรผhrt, um das endgรผltige sortierte Array zu bilden.

Bucket Sort wird hรคufig verwendet, wenn die Elemente folgende sind:

  1. Gleitkommawerte
  2. GleichmรครŸig verteilt รผber einen bekannten Bereich

Die Zeitkomplexitรคt des Bucket-Sort-Algorithmus hรคngt von der Anzahl der verwendeten Buckets und der GleichmรครŸigkeit der Eingabeverteilung ab. Andere Sortieralgorithmen wie beispielsweise โ€ฆ Muschelsortierung, Zusammenfรผhrungssortierung, Heapsortierung und schnelle Sorte Wenn der Bucket-Sort-Algorithmus eine optimale Zeitkomplexitรคt von O(n*logn) erreicht, kann er unter gรผnstigen Bedingungen eine lineare Zeitkomplexitรคt von O(n) erreichen.

Bucket Sort folgt dem Scatter-Gather-Prinzip. Die Elemente werden in entsprechende Buckets verteilt, innerhalb jedes Buckets sortiert und schlieรŸlich zu einem sortierten Array zusammengefรผhrt. Dieses Scatter-Gather-Prinzip wird im folgenden Abschnitt erlรคutert.

Scatter-Gather-Ansatz

Umfangreiche, komplexe Probleme lassen sich mitunter nur schwer direkt lรถsen. Der Scatter-Gather-Ansatz begegnet solchen Problemen, indem er den gesamten Datensatz in Cluster unterteilt. Jeder Cluster wird separat verarbeitet, und die Ergebnisse werden anschlieรŸend zusammengefรผhrt, um das Endergebnis zu ermitteln.

So implementiert der Bucket-Sort-Algorithmus die Scatter-Gather-Methode:

Scatter-Gather-Ansatz

So funktioniert Bucket Sort

Das grundlegende Funktionsprinzip von Bucket Sort ist wie folgt:

  1. Es wird eine Menge leerer Buckets erstellt. Je nach gewรคhlter Richtlinie kann die Anzahl der Buckets variieren.
  2. Aus dem Eingabe-Array wird jedes Element in den entsprechenden Bucket eingefรผgt.
  3. Jeder Behรคlter wird einzeln mithilfe eines sekundรคren Sortieralgorithmus sortiert.
  4. Die sortierten Buckets werden verkettet, um ein einzelnes Ausgabearray zu erzeugen.

Spitzname Code

Start
Create N empty buckets
For each array element:
    Calculate bucket index
    Put that element into the corresponding bucket
For each bucket:
    Sort elements within each bucket
Merge all the elements from each bucket
Output the sorted array
End

Methode 1: Bucket-Sortieralgorithmus fรผr Gleitkomma Numbers

Der Bucket-Sort-Algorithmus fรผr Gleitkommazahlen im Bereich [0.0, 1.0]:

Schritt 1) Erstelle zehn (10) leere Behรคlter. Der erste Behรคlter enthรคlt Zahlen im Bereich [0.0; 0.1). Der zweite Behรคlter enthรคlt Zahlen im Bereich [0.1; 0.2) usw.

Schritt 2) Fรผr jedes Array-Element:

  • a. Berechnen Sie den Bucket-Index mithilfe der folgenden Formel:
    bucket_index = Anzahl_der_buckets * array_element
  • b. Fรผge das Element in bucket[bucket_index] ein.

Schritt 3) Sortieren Sie jeden Eimer einzeln mithilfe der Einfรผgungssortierung.

Schritt 4) Verknรผpfe alle Buckets zu einem einzigen sortierten Array.

Betrachten wir ein Beispiel fรผr Bucket Sort. In diesem Beispiel sortieren wir das folgende Array:

Bucket-Sortieralgorithmus fรผr Gleitkomma Numbers

Schritt 1) Zuerst erstellen wir 10 leere Behรคlter. Der erste Behรคlter enthรคlt Zahlen im Intervall [0.0, 0.1). Der zweite Behรคlter enthรคlt Zahlen im Intervall [0.1, 0.2) usw.

Bucket-Sortieralgorithmus fรผr Gleitkomma Numbers

Schritt 2) Berechne fรผr jedes Array-Element den Bucket-Index und platziere das Element in diesem Bucket.

Der Bucket-Index wird anhand der folgenden Formel berechnet:
        bucket_index = Anzahl_der_buckets * array_element

Berechnung des Bucket-Index:
a) 0.78
      bucket_index = Anzahl_der_buckets * array_element
              = 10 ยท 0.78
              = 7.8
Daher wird das Element 0.78 in bucket[floor(7.8)] oder bucket[7] gespeichert.

Bucket-Sortieralgorithmus fรผr Gleitkomma Numbers

b) 0.17
      bucket_index = Anzahl_der_buckets * array_element
              = 10 ยท 0.17
              = 1.7

Das Array-Element 0.17 wird in bucket[floor(1.7)] oder bucket[1] gespeichert.

Bucket-Sortieralgorithmus fรผr Gleitkomma Numbers

c) 0.39
      bucket_index = Anzahl_der_buckets * array_element
              = 10 ยท 0.39
              = 3.9
0.39 wird in bucket[floor(3.9)] oder bucket[3] gespeichert.

Bucket-Sortieralgorithmus fรผr Gleitkomma Numbers

Nach dem Durchlaufen aller Array-Elemente sehen die Buckets wie folgt aus:

Bucket-Sortieralgorithmus fรผr Gleitkomma Numbers

Schritt 3) Jeder Bucket wird anschlieรŸend mittels Insertion Sort sortiert. Nach dem Sortiervorgang ergibt sich folgende Ausgabe:

Bucket-Sortieralgorithmus fรผr Gleitkomma Numbers

Schritt 4) Im letzten Schritt werden die Buckets zu einem einzigen Array zusammengefรผgt. Dieses Array stellt das sortierte Ergebnis der Eingabe dar.

Jeder Bucket wird an das Ausgabearray angehรคngt. Zum Beispiel die Anhรคngung der Elemente des zweiten Buckets:

Bucket-Sortieralgorithmus fรผr Gleitkomma Numbers

Die Verkettung der letzten Bucket-Elemente wird unten dargestellt:

Bucket-Sortieralgorithmus fรผr Gleitkomma Numbers

Nach der Verkettung entsteht das gewรผnschte sortierte Array.

Bucket-Sortieralgorithmus fรผr Gleitkomma Numbers

Bucket-Sort-Programm in C/C++

Eingang:

//Bucket Sort Program in C/C++
//For values without integer parts
#include <bits/stdc++.h>
#define BUCKET_SIZE 10
using namespace std;
void bucketSort(float input[], int array_size)
{
  vector <float>bucket[BUCKET_SIZE];
  for (int i = 0; i < array_size; i++) {
    int index = BUCKET_SIZE*input[i];
    bucket[index].push_back(input[i]);
  }
  for (int i = 0; i < BUCKET_SIZE; i++)
    sort(bucket[i].begin(), bucket[i].end());
  int out_index = 0;
  for (int i = 0; i < BUCKET_SIZE; i++)
    for (int j = 0; j < bucket[i].size(); j++)
      input[out_index++] = bucket[i][j];
}
int main()
{
  float input[]={0.78,0.17,0.39,0.26,0.72,0.94,0.21,0.12,0.23,0.69};
  int array_size = sizeof(input)/sizeof(input[0]);

  bucketSort(input, array_size);
  cout <<"Sorted Output: 
";
  for (int i = 0; i< array_size; i++)
    cout<<input[i]<<" ";
  return 0;
}

Ausgang:

Sorted Output:
0.12 0.17 0.21 0.23 0.26 0.39 0.69 0.72 0.78 0.94

Bucket-Sort-Programm in Python

Eingang:

# Bucket Sort Program in Python
# For values without integer parts
def bucketSort(input):
    output = []
    bucket_size = 10
    for bucket in range(bucket_size):
        output.append([])
    for element in input:
        index = int(bucket_size * element)
        output[index].append(element)
    for bucket in range(bucket_size):
        output[bucket] = sorted(output[bucket])
    out_index = 0
    for bucket in range(bucket_size):
        for element in range(len(output[bucket])):
            input[out_index] = output[bucket][element]
            out_index += 1
    return input

input = [0.78, 0.17, 0.39, 0.26, 0.72, 0.94, 0.21, 0.12, 0.23, 0.69]
print("Sorted Output:")
print(bucketSort(input))

Ausgang:

Sorted Output:
[0.12, 0.17, 0.21, 0.23, 0.26, 0.39, 0.69, 0.72, 0.78, 0.94]

Bucket-Sortierung in Java

Eingang:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class BucketSort {
    private static final int BUCKET_SIZE = 10;
    public static void bucketSort(float[] input, int arraySize) {
        List<Float>[] bucket = new ArrayList[BUCKET_SIZE];
        for (int i = 0; i < arraySize; i++) {
            int index = (int)(BUCKET_SIZE * input[i]);
            if (bucket[index] == null) {
                bucket[index] = new ArrayList<>();
            }
            bucket[index].add(input[i]);
        }
        for (int i = 0; i < BUCKET_SIZE; i++) {
            if (bucket[i] != null) {
                Collections.sort(bucket[i]);
            }
        }
        int outIndex = 0;
        for (int i = 0; i < BUCKET_SIZE; i++) {
            if (bucket[i] != null) {
                for (float value: bucket[i]) {
                    input[outIndex++] = value;
                }
            }
        }
    }
    public static void main(String[] args) {
        float[] input = {0.78f,0.17f,0.39f,0.26f,0.72f,0.94f,0.21f,0.12f,0.23f,0.69f};
        int arraySize = input.length;
        bucketSort(input, arraySize);
        System.out.println("Sorted Output:");
        for (int i = 0; i < arraySize; i++) {
            System.out.print(input[i]+" ");
        }
    }
}

Ausgang:

Sorted Output:
0.12 0.17 0.21 0.23 0.26 0.39 0.69 0.72 0.78 0.94

Methode 2: Bucket-Sortieralgorithmus fรผr ganzzahlige Elemente

Der Bucket-Sort-Algorithmus fรผr Eingaben, die Zahlen auรŸerhalb des Bereichs [0.0; 1.0] enthalten, unterscheidet sich geringfรผgig vom vorherigen. AlgorithmusDie fรผr diesen Fall erforderlichen Schritte sind wie folgt:

Schritt 1) Finde das grรถรŸte und das kleinste Element im Array.

Schritt 2) Wรคhlen Sie die Anzahl der Buckets, n, und initialisieren Sie diese als leer.

Schritt 3) Berechnen Sie die Reichweite oder Spanne jedes Buckets mithilfe der Formel:
        span = (maximum - minimum) / n

Schritt 4) Fรผr jedes Array-Element:

  • 1. Berechnen Sie den Bucket-Index:
            bucket_index = (element - minimum) / span
  • 2. Fรผge das Element in bucket[bucket_index] ein.

Schritt 5) Sortieren Sie jeden Bucket mithilfe der Einfรผgungssortierung.

Schritt 6) Verketten Sie alle Buckets in einem einzigen Array.

Betrachten wir ein Beispiel fรผr den Bucket-Sort-Algorithmus. In diesem Beispiel sortieren wir das folgende Array:

Bucket-Sortieralgorithmus fรผr ganzzahlige Elemente

Schritt 1) Im ersten Schritt ermitteln wir das grรถรŸte und das kleinste Element des gegebenen Arrays. In diesem Beispiel ist das grรถรŸte Element 24 und das kleinste 1.

Schritt 2) Als Nรคchstes wรคhlen wir die Anzahl der leeren Buckets, n. In diesem Beispiel verwenden wir 5 Buckets und initialisieren sie als leer.

Schritt 3) Die Spannweite jedes Eimers wird anhand der folgenden Formel berechnet:
        span = (maximum - minimum) / n = (24 - 1) / 5 = 4

Daher enthรคlt der erste Behรคlter Zahlen im Bereich [0, 5). Der zweite Behรคlter enthรคlt Zahlen im Bereich [5, 10) usw.

Bucket-Sortieralgorithmus fรผr ganzzahlige Elemente

Schritt 4) Fรผr jedes Array-Element wird der Bucket-Index berechnet und das Element in diesen Bucket eingefรผgt. Der Bucket-Index wird mit folgender Formel berechnet:
        bucket_index = (element - minimum) / span

Berechnung des Bucket-Index:

a) 11
Bucket-Index = (Element โ€“ โ€‹โ€‹Minimum) / Spanne
        = (11-1) / 4
        = 2

Somit wird Element 11 in bucket[2] gespeichert.

Bucket-Sortieralgorithmus fรผr ganzzahlige Elemente

b) 9
Bucket-Index = (Element โ€“ โ€‹โ€‹Minimum) / Spanne
        = (9-1) / 4
        = 2

Hinweis: Da es sich bei 9 um ein Randelement fรผr bucket[1] handelt, wird es an bucket[1] angehรคngt, anstatt im selben Bucket wie das vorherige Element platziert zu werden.

Bucket-Sortieralgorithmus fรผr ganzzahlige Elemente

Nach Durchfรผhrung der Operationen fรผr jedes Element sehen die Buckets wie folgt aus:

Bucket-Sortieralgorithmus fรผr ganzzahlige Elemente

Schritt 5) Nun wird jeder Bucket mithilfe des Insertion Sort-Algorithmus sortiert. Die Buckets nach dem Sortieren:

Bucket-Sortieralgorithmus fรผr ganzzahlige Elemente

Schritt 6) Im letzten Schritt werden die Buckets zu einem einzigen Array zusammengefรผgt. Array ist das sortierte Ergebnis der Eingabe.

Bucket-Sortieralgorithmus fรผr ganzzahlige Elemente

Bucket-Sort-Programm in C/C++

Eingang:

#include<bits/stdc++.h>
using namespace std;
void bucketSort(vector < double > & input, int No_Of_Buckets)
{
  double max_value = * max_element(input.begin(), input.end());
  double min_value = * min_element(input.begin(), input.end());
  double span = (max_value - min_value) / No_Of_Buckets;
  vector<vector <double>> output;
  for (int i = 0; i < No_Of_Buckets; i++)
    output.push_back(vector <double>());
  for (int i = 0; i < input.size(); i++)
  {
    double difference = (input[i] - min_value) / span
     - int((input[i] - min_value) / span);
    if (difference == 0 && input[i] != min_value)
      output[int((input[i] - min_value) / span) - 1].push_back(input[i]);
    else
      output[int((input[i] - min_value) / span)].push_back(input[i]);
  }
  for (int i = 0; i < output.size(); i++)
  {
    if (!output[i].empty())
      sort(output[i].begin(), output[i].end());
  }
  int index = 0;
  for (vector <double> & bucket: output)
  {
    if (!bucket.empty())
    {
      for (double i: bucket)
      {
        input[index] = i;
        index++;
      }
    }
  }
}
int main()
{
  vector <double> input ={11,9,21,8,17,19,13,1,24,12};
  int No_Of_Buckets = 5;
  bucketSort(input, No_Of_Buckets);
  cout<<"Sorted Output:";
  for (int i=0; i < input.size(); i++)
    cout <<input[i]<<" ";
  return 0;
}

Ausgang:

Sorted Output:1 8 9 11 12 13 17 19 21 24

Bucket-Sort-Programm in Python

Eingang:

def bucketSort(input, No_Of_Buckets):
    max_element = max(input)
    min_element = min(input)
    span = (max_element - min_element) / No_Of_Buckets
    output = []
    for bucket in range(No_Of_Buckets):
        output.append([])
    for element in range(len(input)):
        diff = (input[element] - min_element) / span - int(
            (input[element] - min_element) / span
        )
        if diff == 0 and input[element] != min_element:
            output[int((input[element] - min_element) / span) - 1].append(
                input[element]
            )
        else:
            output[int((input[element] - min_element) / span)].append(input[element])
    for bucket in range(len(output)):
        if len(output[bucket]) != 0:
            output[bucket].sort()
    index = 0
    for bucket in output:
        if bucket:
            for element in bucket:
                input[index] = element
                index = index + 1
input = [11, 9, 21, 8, 17, 19, 13, 1, 24, 12]
No_Of_Buckets = 5
bucketSort(input, No_Of_Buckets)
print("Sorted Output:
", input)

Ausgang:

Sorted Output:
[1, 8, 9, 11, 12, 13, 17, 19, 21, 24]

Bucket-Sortierung in Java

Eingang:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class BucketSort {
    public static void bucketSort(List < Double > input, int No_Of_Buckets) {
        double max_value = Collections.max(input);
        double min_value = Collections.min(input);
        double span =(max_value - min_value) / No_Of_Buckets;
        List<List<Double>> output = new ArrayList<>();
        for (int i = 0; i < No_Of_Buckets; i++) {
            output.add(new ArrayList<>());
        }
        for (Double value: input) {
            double difference = (value - min_value) / span - ((value - min_value) / span);
            if (difference == 0 && value != min_value) {
                output.get((int)((value - min_value) / span) - 1).add(value);
            } else {
                output.get((int)((value - min_value) / span)).add(value);
            }
        }
        for (List <Double> bucket: output) {
            if (!bucket.isEmpty()) {
                Collections.sort(bucket);
            }
        }
        int index = 0;
        for (List <Double> bucket: output) {
            if (!bucket.isEmpty()) {
                for (Double value: bucket) {
                    input.set(index,value);
                    index++;
                }
            }
        }
    }
    public static void main(String[] args) {
        List <Double> input = new ArrayList<>();
        input.add(11.0);
        input.add(9.0);
        input.add(21.0);
        input.add(8.0);
        input.add(17.0);
        input.add(19.0);
        input.add(13.0);
        input.add(1.0);
        input.add(24.0);
        input.add(12.0);
        int No_Of_Buckets = 5;
        bucketSort(input, No_Of_Buckets);
        System.out.println("Sorted Output:");
        for (Double value: input) {
            System.out.print(value + " ");
        }
    }
}

Ausgang:

Sorted Output:
1.0 8.0 9.0 11.0 12.0 13.0 17.0 19.0 21.0 24.0

Vor- und Nachteile der Bucket-Sortierung

Vorteile Nachteile
Fรผhrt schnellere Berechnungen auf gleichmรครŸig verteilten Daten durch. Verbraucht mehr Speicherplatz im Vergleich zu In-Place-Sortieralgorithmen.
Kann als externe Sortiermethode fรผr groรŸe Datensรคtze verwendet werden. Die Leistung ist schlecht, wenn die Daten nicht gleichmรครŸig verteilt sind
Buckets kรถnnen unabhรคngig und parallel verarbeitet werden. Erfordert Vorkenntnisse รผber den Datenbereich und die Datenverteilung.

Bucket-Sort-Komplexitรคtsanalyse

Bucket-Sortierung โ€“ Zeitkomplexitรคt

  • beste Fallkomplexitรคt: Wenn alle Array-Elemente gleichmรครŸig verteilt und innerhalb jedes Buckets vorsortiert sind, benรถtigt das Aufteilen der Elemente in die entsprechenden Buckets O(n) Zeit. AnschlieรŸend wird jeder Bucket sortiert. Sortieren durch Einfรผgen Die Kosten betragen O(k). Die Gesamtkomplexitรคt betrรคgt somit O(n+k).
  • Durchschnittliche Fallkomplexitรคt: Im Normalfall gehen wir von einer Gleichverteilung der Eingaben aus. Daher erreicht der Bucket-Sort-Algorithmus eine lineare Zeitkomplexitรคt von O(n+k). Hierbei benรถtigt das Verteilen der Elemente O(n) Zeit und das Sortieren mittels Insertion Sort O(k) Zeit.
  • Komplexitรคt im schlimmsten Fall: Im schlimmsten Fall sind die Elemente nicht gleichmรครŸig verteilt und konzentrieren sich in einem oder zwei Buckets. In diesem Fall verhรคlt sich Bucket Sort รคhnlich wie ein โ€ฆ Bubble-Sort-AlgorithmusDaher betrรคgt die Zeitkomplexitรคt von Bucket Sort im schlimmsten Fall O(nยฒ).

Platzkomplexitรคt der Bucket-Sortierung

Die Speicherkomplexitรคt des Bucket-Sort-Algorithmus betrรคgt O(n*k). Hierbei ist n die Anzahl der Elemente und k die Anzahl der benรถtigten Buckets, um diese wรคhrend des Sortiervorgangs aufzunehmen.

Hรคufig gestellte Fragen

Verwenden Sie Bucket Sort, wenn die Eingabewerte gleichmรครŸig รผber einen bekannten Bereich verteilt sind, insbesondere Gleitkommazahlen im Intervall [0.0; 1.0]. Bei solchen Daten liefert Bucket Sort lineare Laufzeiten, schneidet aber bei geclusterten oder unbekannten Verteilungen schlecht ab.

Bucket Sort ist stabil, wenn der in jedem Bucket verwendete innere Sortieralgorithmus stabil ist. Insertion Sort erhรคlt die relative Reihenfolge gleicher Elemente, daher gilt die Standardimplementierung von Bucket Sort mit Insertion Sort als stabil.

Bucket Sort gruppiert Elemente nach Wertebereich und sortiert jeden Bucket mit einem anderen Algorithmus. Radix Sort gruppiert Zahlen Ziffer fรผr Ziffer und verwendet intern Counting Sort. Bucket Sort bevorzugt gleichverteilte Gleitkommazahlen; Radix Sort bevorzugt ganze Zahlen fester Breite oder Zeichenketten.

Die Worst-Case-Zeitkomplexitรคt von Bucket Sort betrรคgt O(nยฒ). Dies tritt auf, wenn alle Eingabeelemente in einen einzigen Bucket fallen, wodurch der innere Sortieralgorithmus (typischerweise Insertion Sort) ein quadratisches Verhalten aufweist. Eine Gleichverteilung vermeidet dieses Szenario.

Ja. Um negative Werte zu verarbeiten, ermitteln Sie das Minimum und das Maximum und berechnen Sie anschlieรŸend den Bucket-Index mit (Element โ€“ โ€‹โ€‹Minimum) / Spanne. Dadurch werden negative Werte in einen nicht-negativen Indexbereich verschoben, und die Standardlogik des Bucket-Sortings kann unverรคndert fortgesetzt werden.

KI-gestรผtzte Plattformen wie VisuAlgo, Algorithm Visualizer und ChatGPT generierten schrittweise Anleitungen. tracEs hilft Lernenden, Bucket Sort zu visualisieren. Sie animieren die Phasen des Verteilens, Sortierens und Sammelns und erleichtern so das Verstรคndnis der Bucket-Index-Mathematik und der Partitionierungslogik.

KI-gestรผtzte Empfehlungssysteme analysieren DatensatzgrรถรŸe, Werteverteilung und Speicherkapazitรคt, um einen passenden Algorithmus vorzuschlagen. Bei gleichverteilten Gleitkommazahlen bevorzugen solche Systeme Bucket Sort. Bei gemischten Ganzzahlbereichen schlagen sie stattdessen Quicksort oder Radix Sort vor.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: