vickal93 |
QuickSort
Meine Frage:
Hallo,
Ich hänge nun seit gewisser Zeit an meinem Algorithmus für den QuickSort und finde einfach meinen Fehler nicht, denn schlussendlich mag er mir meine Liste nicht sortieren. An sich sollte ja doch mein Algorithmus stimmen, oder etwa nicht?
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
|
public class QuickSort {
/** Array of int sortieren mittels QuickSort */
public static void sort(int[] daten) {
quicksort(daten, 0, daten.length - 1);
}
/** Teilarray of int sortieren mittels QuickSort */
public static void quicksort(int[] daten, int start, int ende) {
if (start >= ende) {
return;
} // Max 1 Element: fertig!
// Divide at Pivot:
final int pivot = daten[start]; // Pivot
int links = start + 1;
int rechts = ende;
while (true) {
while (daten[links] < pivot) {
links++;
if (links == rechts) {
break;
}
}
while (daten[rechts] > pivot) {
rechts--;
if (rechts == links) {
break;
}
}
if (links < rechts) {
int temp = daten[links];
daten[links] = daten[rechts];
daten[rechts] = temp;
links++;
rechts--;
} else {
break;
}
}
// Pivot an der RICHTIGEN Position einsetzen:
SortUtil.vertausche(daten, links, rechts);
// Conquer (kein Merge notwendig, wenn Pivot korrekt):
quicksort(daten, start, rechts - 1);
quicksort(daten, rechts + 1, ende);
}
// zum Testen
public static void main(String[] args) {
int[] test = new int[] { 23, 12, 45, 31, 51, 71, 07 };
sort(test);
System.out.print("Ergebnis:");
for (int val : test) {
System.out.print(" " + val);
}
System.out.println();
System.out.println("Sortiert? " + SortUtil.isSorted(test));
}
}
|
|
sowie die SortUtil Klasse:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
|
public class SortUtil {
/** Testet, ob Daten sortiert sind. */
public static boolean isSorted(int[] daten) {
int prev = daten[0];
for (int i = 1; i < daten.length; i++) {
if (daten[i] < prev) {
return false;
}
prev = daten[i];
}
return true;
}
/** Vertauscht zwei Elemente */
public static void vertausche(int[] daten, int x, int y) {
final int tmp = daten[x];
daten[x] = daten[y];
daten[y] = tmp;
}
}
|
|
Meine Ideen:
Wäre Euch für jeden Hilfe sehr dankbar! |
eulerscheZahl |
Das Tauschen muss in die Schleife. |
vickal93 |
Aber da wo es vertauscht wird, ist doch bereits in der if-Schleife und diese wieder in der while? |
eulerscheZahl |
So etwas, wie eine if-Schleife gibt es nicht. Eine Schleife wird mehrfach durchlaufen, der Code in einer if Anweisung 0 oder 1 mal.
Es muss ins while. |