From: Matthias Braun Date: Tue, 24 Oct 2006 20:28:30 +0000 (+0000) Subject: you can disable counting in quicksort now X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=4fe9bb0373885548744fb97c457c15303d35da46;p=libfirm you can disable counting in quicksort now --- diff --git a/ir/be/test/QuickSort.c b/ir/be/test/QuickSort.c index 0f0940b07..6a20c2d28 100644 --- a/ir/be/test/QuickSort.c +++ b/ir/be/test/QuickSort.c @@ -10,57 +10,76 @@ * Licence: * URL: http://www-info1.informatik.uni-wuerzburg.de/staff/wolf/teaching/pi1_ws98/java/QuickSort.java */ - #include #include +#define COUNTACTIONS + +#ifdef COUNTACTIONS // Variablen, in denen die Bewegungen und Vergleiche gespeichert werden -static int bewegungen; -static int vergleiche; +static int bewegungen = 0; +static int vergleiche = 0; +#endif //-------------------- // quicksort-Funktion //-------------------- static void quicksort(int *fld, int l, int r ) { - // Wenn der zu sortierende Teil eine Laenge <= 1 hat -> fertig - if( l < r ) { - int pivot = fld[r]; - int i = l-1, j = r; - int v; - - // mit dem Pivotelement sortieren - while( 1 ) { - while( fld[++i] < pivot ) - vergleiche++; - vergleiche++; - - while( j > l && fld[--j] > pivot ) - vergleiche++; - vergleiche++; - // Wenn j <= i ist, wurde der zu sortierende Teil des Feldes - // durchlaufen -> fertig - if( j <= i ) - break; - - // Elemente tauschen - v = fld[i]; - fld[i] = fld[j]; - fld[j] = v; - // ein Tausch zweier Feldelemente wird als eine Bewegung gerechnet - bewegungen++; - } - - // Pivotelement in die Mitte tauschen - fld[r] = fld[i]; - fld[i] = pivot; - - bewegungen++; - - // Die zwei Teilfolgen rekursiv mit quicksort sortieren - quicksort( fld, l, i-1 ); - quicksort( fld, i+1, r ); - } + // Wenn der zu sortierende Teil eine Laenge <= 1 hat -> fertig + if( l >= r ) + return; + + int pivot = fld[r]; + int i = l-1, j = r; + int v; + + // mit dem Pivotelement sortieren + while( 1 ) { + while( fld[++i] < pivot ) { +#ifdef COUNTACTIONS + vergleiche++; +#endif + } +#ifdef COUNTACTIONS + vergleiche++; +#endif + + while( j > l && fld[--j] > pivot ) { +#ifdef COUNTACTIONS + vergleiche++; +#endif + } + +#ifdef COUNTACTIONS + vergleiche++; +#endif + // Wenn j <= i ist, wurde der zu sortierende Teil des Feldes + // durchlaufen -> fertig + if( j <= i ) + break; + + // Elemente tauschen + v = fld[i]; + fld[i] = fld[j]; + fld[j] = v; + // ein Tausch zweier Feldelemente wird als eine Bewegung gerechnet +#ifdef COUNTACTIONS + bewegungen++; +#endif + } + + // Pivotelement in die Mitte tauschen + fld[r] = fld[i]; + fld[i] = pivot; + +#ifdef COUNTACTIONS + bewegungen++; +#endif + + // Die zwei Teilfolgen rekursiv mit quicksort sortieren + quicksort( fld, l, i-1 ); + quicksort( fld, i+1, r ); } int verify(int* fld, int count) { @@ -103,14 +122,15 @@ int main(int argc, char *argv[]) { printf("Sorting %d random numbers (seed %d)\n", count, seed); // Sortieren - bewegungen = 0; - vergleiche = 0; quicksort(fld, 0, count-1); // Ausgabe +#ifdef COUNTACTIONS printf("Sorted. (needed %d comparisons and %d moves.\n", vergleiche, bewegungen); +#else + printf("Sorted.\n"); +#endif - // TODO verify if(verify(fld, count)) printf("Verify succeeded.\n"); else