Datenstrukturen. Sortieralgorithmen. am Beispiel Java. c Y. Pfeifer. (Mai 2013)

Ähnliche Dokumente
Algorithmen und Datenstrukturen 1

Sortierverfahren. Sortierverfahren für eindimensionale Arrays

Sortieralgorithmen. Inhalt: InsertionSort BubbleSort QuickSort. Marco Block

Kapitel 6 Elementare Sortieralgorithmen

Grundlegende Sortieralgorithmen

JAVA - Suchen - Sortieren

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Sortierverfahren für Felder (Listen)

BUBBLE SORT. Können wir die gefundenen Algorithmen auch auf Listen mit mehr als drei Elementen ausdehnen?

Folge 13 - Quicksort

Sortieralgorithmen. Jan Pöschko. 18. Januar Problemstellung Definition Warum Sortieren?... 2

Prof. H. Herbstreith Fachbereich Informatik. Leistungsnachweis. Informatik 1 WS 2001/2002

2.3.1 Einleitung Einfache Sortierverfahren Höhere Sortierverfahren Komplexität von Sortierverfahren Spezielle Sortierverfahren

Programmieren I. Kapitel 7. Sortieren und Suchen

2 Sortieren. Beispiel: Es seien n = 8 und a = i : a i : ϕ(i) : a ϕ(i) :

Einführung in die Informatik I Kapitel II.3: Sortieren

1. Grundlagen Sortieren Vertauschen Selektion Einfügen Quicksort Suchen...

Suchen und Sortieren (Die klassischen Algorithmen)

Pro Informatik 2009: Objektorientierte Programmierung Tag 17. Marco Block-Berlitz, Miao Wang Freie Universität Berlin, Institut für Informatik

Übersicht. Datenstrukturen und Algorithmen. Übersicht. Divide-and-Conquer. Vorlesung 9: Quicksort (K7)

Sortieren. Eine Testmenge erstellen

Grundlagen der Programmierung

Übungsblatt 1. f(n) = f(n) = O(g(n)) g(n) = O(f(n)) Zeigen oder widerlegen Sie: 3 n = Θ(2 n ) Aufgabe 1.2 Gegeben sei die folgende Funktion:

Datenstrukturen und Algorithmen

Wie funktioniert das Sortieren einer Reihe von Zufallszahlen mit Quicksort?

Einstieg in die Informatik mit Java

Programmierkurs Java

Algorithmen und Datenstrukturen Wintersemester 2004/ November T(n) = T(n a) + T(a) + n

MAXIMUM2.STR Struktogramme. Aufgabe: 3 Zahlen eingeben, größte Zahl ermitteln und ausgeben.

Fragen für die Klausuren

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

KV Software Engineering Übungsaufgaben SS 2005

Teil 2 Algorithmen und Datenstrukturen

Einführung in die Informatik 2

Sortieren Jiri Spale, Algorithmen und Datenstrukturen - Sortieren 1

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

Informatik II Musterlösung

Name: Seite 2. Beantworten Sie die Fragen in den Aufgaben 1 und 2 mit einer kurzen, prägnanten Antwort.

Algorithmen und Datenstrukturen

Studentische Lösung zum Übungsblatt Nr. 7

II.3.1 Rekursive Algorithmen - 1 -

Ausgewählte Algorithmen: Sortieren von Listen

Inf 12 Aufgaben

Sortieren durch Einfügen. Prof. Dr. W. Kowalk Sortieren durch Einfügen 1

Student: Alexander Carls Matrikelnummer: Aufgabe: Beschreibung des euklidischen Algorithmus Datum:

Einführung in die Informatik 2

Überblick. Lineares Suchen

EndTermTest PROGALGO WS1516 A

3. Anweisungen und Kontrollstrukturen

Technische Universität Wien Institut für Computergraphik und Algorithmen Arbeitsbereich für Algorithmen und Datenstrukturen

Abgabe: (vor der Vorlesung) Aufgabe 2.1 (P) O-Notation Beweisen Sie die folgenden Aussagen für positive Funktionen f und g:

11.1 Grundlagen - Denitionen

Natürliche Zahlen, Summen und Summenformeln

Programmierung mit Feldern OOPM, Ralf Lämmel

Leitprogramm Bubblesort

Algorithmentheorie Randomisierung. Robert Elsässer

Objektorientierte Programmierung OOP Programmieren mit Java

Übung Grundlagen der Programmierung. Übung 05: Arrays. Abgabetermin: xx.xx.xxxx. Java-Programm Testplan Testergebnisse

Dr. Monika Meiler. Inhalt

Vom Leichtesten zum Schwersten Sortieralgorithmen

Computational Intelligence

Grundlagen der Programmierung 2. Sortierverfahren

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Blöcke. Beispiel: Variablen in Blöcken

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Nachklausur zu Einführung in die Programmierung 14. Oktober 2008 (SS 2008) Prof. Dr. Franz Schweiggert / Christoph Ott

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Datenstruktur, die viele Operationen dynamischer Mengen unterstützt

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

Es ist für die Lösung der Programmieraufgabe nicht nötig, den mathematischen Hintergrund zu verstehen, es kann aber beim Verständnis helfen.

Wirtschaftsinformatik I

Probeklausur: Programmierung WS04/05

Teil III: Evaluationstest

GI Vektoren

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Zeitoptimale Sortierverfahren

MB2-ALG, SS15 Seite 1 Hauptklausur, geschrieben am

Suchen und Sortieren Sortieren. Heaps

Klausur C-Programmierung / / Klingebiel / 60 Minuten / 60 Punkte

Kapitel 7. Zusammengesetzte Datentypen, Vektoren, Zeichenketten

Einführung Elementare Datenstrukturen. Der Konstruktor muß den Listenkopf head erzeugen. Der Vorgänger und Nachfolger von head ist head selbst.

Übungen zu Programmierung I - Blatt 8

6 Speicherorganisation

Median und i-kleinste Elemente

Sortieralgorithmen. Vorlesung Algorithmen und Datenstrukturen 2. Prof. Dr. W. P. Kowalk Universität Oldenburg

Fallunterscheidung: if-statement

Vorkurs Informatik Wintersemester 2015/2016. Programmtexte

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 8. Arrays. Arrays

Aufgabenblatt Nr. 5 Generizität und TicTacToe

4. Fortgeschrittene Algorithmen 4.1 Rekursion 4.2 Daten und Datenstrukturen 4.3 Bäume

Alle bislang betrachteten Sortieralgorithmen hatten (worst-case) Laufzeit Ω(nlog(n)).

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

Transkript:

Datenstrukturen Sortieralgorithmen am Beispiel Java c Y. Pfeifer (Mai 013)

1 Sortieralgorithmen 1.1 Straight Insertion Bei diesem Einfügeverfahren wird eine Zahlenreihe mit n Elementen von links nach rechts durchlaufen, beginnend mit dem. Element. Für jedes Element ki, dessen Inhalt zunächst in einer Hilfsvariable (hier temp) gesichert wird, erfolgt eine wertmäßige Prüfung in Bezug auf die links stehenden Elemente. Alle Elemente, die links von ki stehen und größer als ki sind, werden um einen Platz nach rechts verschoben. Der Inhalt von ki wandert auf den frei gewordenen Platz. Hinweis: Die Elemente werden in einem Array ab dem Index 1 abgespeichert; Arr[0] dient für Verwaltungszwecke! Anzahl der Vergleiche: [n-1; n/+n/-1] Im günstigsten Fall (Best Case) liegt eine sortierte Folge vor (k1<k<...<kn), sodass ein Schlüssel immer größer ist als die von ihm links stehenden. Die for-schleife wird 1x für alle Elemente durchlaufen, die Bedingung für die innere while-schleife trifft nie zu. Beim Worst Case handelt es sich um eine umgekehrt sortierte Folge (k1>k>...>kn), für jedes Element fällt das Maximum an Vergleichen an (jeweils Anzahl der links stehenden Elemente + 1 = 0 +1 + +3 +... + (n-1) + (n-1)). 1 public static int[] straightinsert(int arr[],int anzelemente,boolean comment){ 3 4 int temp,i,j; 5 int dl=0; 6 int n=anzelemente; 7 int anzvgl=0; 8 9 for(i=;i<=n;i++) 10 { 11 temp=arr[i]; // Hilfselement 1 arr[0]=temp; / damit die while Schleife in jedem Fall abbricht / 13 j=i 1; 14 while(arr[j]>temp){ 15 arr[j+1]=arr[j]; j ; 16 anzvgl++; 17 } 18 arr[j+1]=temp; 19 0 dl++; 1 if(comment) ausgabe(arr,dl+". Einfügeschritt"); } 3 4 anzvgl+=n 1; 5 return arr; 6 } Listing 1.1: Straightinsert

1. Shellsort Beim Shellsort, einem weiteren Einfügeverfahren, wird eine Zahlenreihe mit Hilfe der sogenannten l-sortierung vorsortiert. l bezeichnet hierbei die Nummer des x-ten Elements. Beispielsweise wird bei der 3-Sortierung eine Zahlenreihe aus den Elementen, deren Index ein Vielfaches von 3 darstellt, gebildet und diese entsprechend sortiert. Mit den Elementen, die durch Index mod 3 derselben Klasse angehören, wird identisch verfahren. D.h. arr[1+l] wird mit arr[1] verglichen, arr[+l] mit arr[],... l sollte logischerweise n/ nicht überschreiten und wird programmtechnisch auf die größte ganze Zahl festgelegt, welche sich aus n* alpha (alpha = 0,45454) errechnet. Ergibt sich im Laufe der Programmausführung für l der Wert 0, so wird dieser durch 1 ersetzt. l=1 bildet immer den letzten Durchlauf, sodass eine vollständige Sortierung gewährleistet ist. L-Sort: 1 public static int[] lsort(int arr[],int l,int anzelemente,boolean comment){ 3 int temp,i,j; 4 int n=anzelemente; 5 6 for(i=1+l;i<=n;i++) 7 { 8 temp=arr[i]; 9 j=i l; 10 while((j>=1)&&(arr[j]>temp)){ 11 arr[j+l]=arr[j]; 1 j =l; 13 14 //anzvgl++; 15 } 16 arr[j+l]=temp; 17 18 } 19 if(comment) ausgabe(arr," "+l+" Sortierung"); 0 1 return arr; } Shellsort: Listing 1.: L-Sortierung 1 public static int[] shellsort(int arr[], int anzelemente, boolean comment){ 3 double alpha=0.45454; 4 int l=(int)(anzelemente alpha); 5 int n=anzelemente; 6 7 while(l>1){ 8 lsort(arr,l,anzelemente,comment); 9 l=(int)(l alpha); 10 } 11 lsort(arr,1,n,comment); 1 13 return arr; 14 } Listing 1.3: Shellsort 3

1.3 Bubblesort Bubblesort gehört zu den Austauschverfahren und ist durch seine hohe Anzahl an Vergleichen extrem langsam. Beim Durchlauf einer Zahlenreihe von links nach rechts werden jeweils zwei aufeinanderfolgende Zahlen auf Inversion geprüft. Eine Inversion liegt dann vor, wenn eine benachbarte Zahl mit höherem Index einen geringeren Wert aufweist als der Vorgänger. Im Falle einer Inversion findet ein Tausch der Nachbarn statt. Der Durchlauf durch die Zahlenreihe erfolgt solange bis keine Inversion mehr vorliegt. Da sich der größte Zahlenwert einer Reihe innerhalb eines Durchlaufs auf den letzten Platz weiterschiebt, d.h. spätestens nach dem i-ten Durchlauf sitzt das i.-größte Element an der richtigen Stelle, kann der Durchlauf entsprechend verkürzt werden. Durch Speicherung des Indexes des zuletzt vertauschten Elements ist ein Durchlauf nur bis zu diesem Element erforderlich, da alle folgenden Elemente bereits die richtige Reihenfolge aufweisen. Anzahl der Vergleiche im Best Case (sortierte Folge): n-1 Anzahl der Vergleiche im Worst Case: n(n-1)/ = n/-n/ 1 public static int[] bubblesort(int arr[],int anzelemente,boolean comment){ 3 int i,j,r; 4 int temp; 5 int dl=0; 6 7 8 r=anzelemente; // 1. DL geht bis zum Ende 9 while(r>1){ 10 j=0; 11 for(i=1;i<r;i++) 1 { 13 if(arr[i]>arr[i+1]){ // dann vertauschen 14 15 temp=arr[i+1]; 16 arr[i+1]=arr[i]; 17 arr[i]=temp; 18 j=i; // Index merken 19 } 0 } 1 r=j; // letzte Vertauschung in diesem DL dl++; 3 4 if(comment) ausgabe(arr," "+dl+". Durchlauf"); 5 } 6 return arr; 7 } Listing 1.4: Bubblesort 4

1.4 Quicksort zählt ebenfalls zu den Austauschverfahren und ist der schnellste Sortieralgorithmus im Mittel. Vorgehen: man wähle zunächst ein mittleres Element k (Index = größte ganze Zahl, die sich aus den gemittelten Indices von erstem und letztem Element ergibt), dessen Wert für Vergleiche herangezogen wird. durchlaufe die Zahlenreihe von links nach rechts bis ein Wert größer/gleich dem Vergleichswert gefunden wird. Analog dazu: durchlaufe die Zahlenreihe von rechts nach links bis ein Wert kleiner/gleich dem Vergleichswert gefunden wird. Diese heißen Fehlstände bzgl. k. Die Fehlstände werden vertauscht, die Laufindices um 1 erhöht bzw. erniedrigt. Danach wird entsprechend weiter verfahren bis die Durchsuchungen von links und rechts zusammentreffen. Ergebnis des Zerlegungsschritts ist eine Zwei- oder Dreiteilung. Bei einer Zweiteilung kann x in linker oder rechter Teilfolge stehen. Im optimalen Fall steht x an der richtigen Stelle und wird nicht mehr betrachtet. Dann ergibt sich eine Dreiteilung (1. Bereich Werte<x,. Bereich enthält nur x, 3. Bereich Werte>x). Für die sich ergebenden Bereiche wird die Funktion rekursiv wieder aufgerufen, wobei 1- elementige Teilfolgen nicht mehr bearbeitet werden. Das Ende des Algorithmus ist erreicht, wenn nur noch 1-elementige Folgen vorliegen, dann ist die Zahlenreihe vollständig sortiert. 1 public static int []quicksort(int arr[],int l,int r, boolean comment){ 3 int i,j; 4 int temp; 5 int x; // Vergleichselement 6 if(l>=r) return arr; // nichts zu tun 7 i=l; 8 j=r; 9 10 x=arr[(l+r)/]; // Beginn des Zerlegungsschritts 11 System.out.println("Beginn des Zerlegungschritts: x=arr["+(1+r)/+"]="+x); 1 while(i<=j){ 13 while(arr[i]<x) i++; 14 if(comment) System.out.println(" i="+i); 15 while(arr[j]>x) j ; 16 if(comment) System.out.println(" j="+j); 17 if(i<=j){ 18 temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; 19 System.out.println("vertausche i="+i+" und j="+j); 0 i++; j ; 1 // Ende des Zerlegungsschritts 3 ausgabe(arr,""); 4 } 5 } 6 7 quicksort(arr,l,j,comment); 8 quicksort(arr,i,r,comment); 9 30 return arr; 31 } Listing 1.5: Quicksort 5

1.5 Straight Selection Bei dem auch als Direktes Auswählen bezeichneten Verfahren wird in jedem Durchlauf der kleinste Wert einer Zahlenreihe gefunden und mit dem n-ten Platz vertauscht. n beginnt mit Index 1 und endet mit n-1. Danach ist die Zahlenreihe vollständig sortiert. Straight Selection ist im Mittel schneller als Straight Insertion, bei sortierten Folgen ist es umgekehrt, da Straight Insertion im optimalen Fall nur n-1 Vergleiche benötigt. 1 public static int[] straightselect(int arr[],int anzelemente,boolean comment){ 3 int temp,i,j,k,l; 4 int n=anzelemente; 5 6 for(i=1;i<=n 1;i++) 7 { 8 l=i; 9 k=arr[i]; 10 for(j=i+1;j<=n;j++) // suche Element mit minimalem Wert 11 { 1 if(arr[j]<k){ 13 l=j; 14 k=arr[j]; 15 } 16 } 17 temp=arr[i]; arr[i]=arr[l]; arr[l]=temp; // Vertauschung 18 if(comment) ausgabe(arr,""); 19 0 } 1 return arr; } Listing 1.6: Straight Selection 6