Hallo zusammen,
schreibe grade an dem guten alten Quicksort, diesmal für das Sortieren eines eindimensionalen Arrays von Objekten, des Typs Objekte...soweit so gut: schicke Array rein, kommt sortiert raus.
Mein Problem ist, dass ich die Anzahl der Vergleiche der Objekte untereinander zählen möchte.
Als Wert für zB 8 Elemente bekam ich teills 10 Vergleiche zurück...aber da untere Schranke (soweit ich weiß) n*log(n) ist, muss bei mir irgendwo was falsch laufen.
Das Problem tritt bei mir sowohl für eine Random wahl des Pivots als auch für Wahl des mittleren Elements als Pivot auf. Wobei die Werte für Random schlimmer aussehen...was insofern wenig Sinn macht, da es kopierter code mit lediglicher Änderung der Pivot Strategie ist.
Zum zählen habe ich jeweils ausserhalb der Methode einen Counter initialisiert, damit die Rekursion nicht rumfuscht.
Und unmittelbar bevor ein Vergleich kommt, zähle ich hoch, aber i-wie tuts das nicht.
Hoffe ihr könnt mir helfen:
greetz
Aticus
schreibe grade an dem guten alten Quicksort, diesmal für das Sortieren eines eindimensionalen Arrays von Objekten, des Typs Objekte...soweit so gut: schicke Array rein, kommt sortiert raus.
Mein Problem ist, dass ich die Anzahl der Vergleiche der Objekte untereinander zählen möchte.
Als Wert für zB 8 Elemente bekam ich teills 10 Vergleiche zurück...aber da untere Schranke (soweit ich weiß) n*log(n) ist, muss bei mir irgendwo was falsch laufen.
Das Problem tritt bei mir sowohl für eine Random wahl des Pivots als auch für Wahl des mittleren Elements als Pivot auf. Wobei die Werte für Random schlimmer aussehen...was insofern wenig Sinn macht, da es kopierter code mit lediglicher Änderung der Pivot Strategie ist.
Zum zählen habe ich jeweils ausserhalb der Methode einen Counter initialisiert, damit die Rekursion nicht rumfuscht.
Und unmittelbar bevor ein Vergleich kommt, zähle ich hoch, aber i-wie tuts das nicht.
Hoffe ihr könnt mir helfen:
Java:
public class Sorter {
//hier startet quick mit mittlerem Pivot
static int vergleichequickmid=0;
public static int quickmidsort (int UntereGrenze, int ObereGrenze,Objekte[] objektsammlung)
{
int links = UntereGrenze;
int rechts = ObereGrenze;
Objekte Pivotelement = objektsammlung[((UntereGrenze+ObereGrenze) / 2)]; //Pivotstrategie
do
{
while (++vergleichequickmid>-1 && Pivotelement.compareTo(objektsammlung[links])>0) //hier zähle ich mit
links = links + 1 ;
while (++vergleichequickmid>-1 && objektsammlung[rechts].compareTo(Pivotelement)>0) //ebenso hier
rechts = rechts - 1;
if (links <= rechts)
{
//Vertauschen der Elemente
Objekte Merke = objektsammlung[links];
objektsammlung[links] = objektsammlung[rechts];
objektsammlung[rechts] = Merke;
links = links + 1;
rechts = rechts - 1;
}
} while (links <= rechts);
if (UntereGrenze < rechts)
quickmidsort(UntereGrenze, rechts, objektsammlung); //Rekursion
if (links < ObereGrenze)
quickmidsort(links, ObereGrenze, objektsammlung); //Rekursion
return vergleichequickmid;}
//Hier startet es mit randomsort
static int vergleichequickrand=0; //der counter
public static int quickrandsort (int UntereGrenze, int ObereGrenze,Objekte[] objektsammlung)
{
int links = UntereGrenze;
int rechts = ObereGrenze;
Objekte Pivotelement = objektsammlung[UntereGrenze+ rnd.nextInt(ObereGrenze-UntereGrenze)]; //Pivotstrategie
do
{
while (++vergleichequickrand>-1 && Pivotelement.compareTo(objektsammlung[links])>0) //hier zähle ich
links = links + 1 ;
while (++vergleichequickrand>-1 && objektsammlung[rechts].compareTo(Pivotelement)>0)//ebenso wie hier
rechts = rechts - 1;
if (links <= rechts)
{
//Vertauschen der Elemente
Objekte Merke = objektsammlung[links];
objektsammlung[links] = objektsammlung[rechts];
objektsammlung[rechts] = Merke;
links = links + 1;
rechts = rechts - 1;
}
} while (links <= rechts);
if (UntereGrenze < rechts)
quickmidsort(UntereGrenze, rechts, objektsammlung); //Rekursion
if (links < ObereGrenze)
quickmidsort(links, ObereGrenze, objektsammlung); //Rekursion
return vergleichequickrand;}
private static java.util.Random rnd = new java.util.Random();
}
greetz
Aticus