Dennis Parsch - IT-Dienstleistungen & Webdesign


Infotext der Firma

Java - SelectionSort

Inhaltsverzeichnis

- Implementierung in Java
- Ausführung des Codes
- Sortierung der Testdateien
- Quellenangabe
- Anhang: Gesamter Quellcode

Einleitung

Im Folgenden werden wir die Implementierung den Algorithmus des SelectionSort in Java erläutern. Der Algorithmus selbst wurde bereits in der Veranstaltung "Algorithmen und Datenstrukturen" im Wintersemester 2010/2011 behandelt. Hier wird deshalb nur auf den Quellcode der Implementierung sowie auf Messwerte bei der Sortierung von Objekten mit diesem Quellcode eingegangen.

Implementierung in Java

Da die Ausführungsdauer der Sortierung anhand unterschiedlicher Datensätze gemessen wurde und eine Abfrage der Typen, sowie die Ausgabe jedes Sortierschrittes das Ergebnis der Messung verfälscht hätte, haben wir uns entschlossen, nicht auf generische Klassen zurückzugreifen. Unsere Klassen sind speziell für die Datentypen Student_MatNr und Student_Voll angepasst und müssen möglicherweise für eine Implementierung in einem anderen System abgeändert werden.

Die Definition der Klasse:
public class SelectionSort
{
    // Methoden werden noch aufgeführt
}
Da unsere Methoden statisch sind - d. h. von überall aus ohne vorher initialisiert worden zu sein, aufgerufen werden können - nutzen wir keinen Konstruktor. Dieser ist gültig für die Sortierung beider Datentypen.

Sortierung - Student_MatNr[] SelectionSort:
public static Student_MatNr[] SelectionSort(Student_MatNr[] array)
{
    int min;

    for(int i = 0; i < array.length - 1; i++)
    {
       min = i;
       for(int j = i + 1; j < array.length; j++)
           if(array[j].getMatNr() < array[min].getMatNr())
               min = j;

        array = Swap(array, i, min);
     }
    return array;
}
Die Funktion sortiert einen Array vom Typ Student_MatNr nach dem SelectionSort-Verfahren: Man suche in der Eingabesequenz A das kleinste Element m und setze es vorne vor die sortierte Restsequenz.

Methode Student_MatNr[] Swap:
private static Student_MatNr[] Swap(Student_MatNr[] array, int idx1, int idx2)
{
    Student_MatNr tmp = array[idx1];
    array[idx1] = array[idx2];
    array[idx2] = tmp;

    return array;
}
Die Methode Swap ist für das Tauschen zweier Elemente in einem Array zuständig. Der erste Parameter ist der Array, der Zweite und der Dritte geben die Stellen an, die getauscht werden sollen. Dabei wird eine neue temporäre Variable angelegt, die den alten Array Wert speichert. Anschließend wird einer der zu tauschenden Elemente in das andere überschrieben und die Variable in das andere Feld geschrieben.

Methode Student_Voll[] SelectionSort:
public static Student_Voll[] SelectionSort(Student_Voll[] array)
{
    int min;

    for(int i = 0; i < array.length - 1; i++)
    {
       min = i;
       for(int j = i + 1; j < array.length; j++)
           if(array[j].getMatNr() < array[min].getMatNr())
               min = j;

        array = Swap(array, i, min);
     }
    return array;
}

Methode Student_Voll[] Swap:
private static Student_Voll[] Swap(Student_Voll[] array, int idx1, int idx2)
{
    Student_Voll tmp = array[idx1];
    array[idx1] = array[idx2];
    array[idx2] = tmp;

    return array;
}

Ausführung des Codes

Die grünen Bereiche sind bereits sortiert und die gelben Zahlen werden vertauscht.
------ Original ------------------
38 39 12 36 88 15 06 61 IN OUT | Beginne bei Index 1: 06 <-> 38
----------------------------------
06 39 12 36 88 15 38 61 2 + 3 | Beginn ist nun Index 2: 12 <-> 39
06 12 39 36 88 15 38 61 1 + 3 | 15 <-> 39
06 12 15 36 88 39 38 61 2 + 3 | kein Tausch
06 12 15 36 88 39 38 61 0 + 3 | 38 <-> 88
06 12 15 36 38 39 88 61 2 + 3 | kein Tausch
06 12 15 36 38 39 88 61 0 + 3 | 61 <-> 88
06 12 15 36 38 39 61 88 1 + 3 | Liste ist fertig sortiert

Sortierung der Testdateien

Bewegungen:
Datei Innere Bewegungen Äußere Bewegungen Bewegungen gesamt
studenten_mtNr_datei_50TN 133 147 280
studenten_mtNr_datei_1500TN 8.682 4.497 13.179
studenten_voll_datei_50TN 132 147 279
studenten_voll_datei_1500TN 8.756 4.497 13.253

Dauer:
Datei Dauer Einlesen Dauer Sortiervorgang
studenten_mtNr_datei_50TN 0,028310198 0,001531516
studenten_mtNr_datei_1500TN 0,087168954 0,02154983
studenten_voll_datei_50TN 0,031060155 0,00359258
studenten_voll_datei_1500TN 0,39625102 0,01929279

Die hier angegebenen Messwerte sind Durchschnittswerten von 3 Ausführungen. Um die Messwerte besser vergleichen zu können, wurde auf der virtuellen Maschine vom Typ DB1 sortiert.

Quellenangabe

Literatur:
- Datenstrukturen und Algorithmen von Bernd Breutmann (Arbeitsblatt)

Internet:
- http://www.stefan-baur.de/cs.algo.selectionsort.html
- http://leepoint.net/notes-java/data/arrays/31arrayselectionsort.html

Anhang: Gesamter Quellcode

Datentyp Student_MatNr:
public static Student_MatNr[] SelectionSort(Student_MatNr[] array)
{
    int min;

    for(int i = 0; i < array.length - 1; i++)
    {
       min = i;
       for(int j = i + 1; j < array.length; j++)
           if(array[j].getMatNr() < array[min].getMatNr())
               min = j;

        array = Swap(array, i, min);
     }
    return array;
}

private static Student_MatNr[] Swap(Student_MatNr[] array, int idx1, int idx2)
{
    Student_MatNr tmp = array[idx1];
    array[idx1] = array[idx2];
    array[idx2] = tmp;

    return array;
}

Datentyp Student_Voll:
public static Student_Voll[] SelectionSort(Student_Voll[] array)
{
    int min;

    for(int i = 0; i < array.length - 1; i++)
    {
       min = i;
       for(int j = i + 1; j < array.length; j++)
           if(array[j].getMatNr() < array[min].getMatNr())
               min = j;

        array = Swap(array, i, min);
     }
    return array;
}

private static Student_Voll[] Swap(Student_Voll[] array, int idx1, int idx2)
{
    Student_Voll tmp = array[idx1];
    array[idx1] = array[idx2];
    array[idx2] = tmp;

    return array;
}