Array aufsteigend oder absteigend oder gemischte Reihenfolge?



  • Tachyon schrieb:

    Korhil schrieb:

    @Tachyon Vielleicht soll anhand dieser Zeilen ja gerade entschieden werden, ob ein Sortieralgorithmus eingesetzt werden soll. Außerdem schadet ein wenig Programmierpraxis - auch wenn sie unnötig ist - dem Lernenden nicht.

    Auch wieder war-

    Korhil schrieb:

    @Stefanos

    fflush(stdin);
    

    Das ist kein ANSI C, siehe (http://www.c-plusplus.net/forum/viewtopic-var-t-is-39349.html)

    Klar ist das ANSI C. Nur das Verhalten ist undefiniert.

    Okay, aber ist etwas undefiniertes akzeptabler ?



  • Hallo,

    was hälst du von folgender Lösung? Die Funktion hat eine Signatur analog zu qsort aus der Standardbibliothek; sie kann auf Arrays beliebigen Typs abgeschossen werden und auch die Vergleichsfunktion wird übergeben.

    Grüße
    Martin

    #include <stdlib.h>
    #include <stdio.h>
    
    #define UNORDERED 0
    #define ASCENDING 1
    #define DESCENDING 2
    
    int asc_descending(void *base, size_t nmemb, size_t size,
    		   int (*compar) (const void *, const void *))
    {
    	register unsigned char *i, *r;
    	int res = ASCENDING | DESCENDING;
    
    	i = r = base;
    	r += --nmemb * size;
    
    	while (i < r) {
    		int c = (*compar) (i, i + size);
    		if (c < 0)
    			res &= ~DESCENDING;
    		else if (c > 0)
    			res &= ~ASCENDING;
    		i += size;
    	}
    
    	return res;
    }
    
    static int cmp(const void *p1, const void *p2)
    {
    	return *(const int *)p1 - *(const int *)p2;
    }
    
    int main()
    {
    	int v[] = { 0, 1, 1, 2, 3, 5, 8 };
    	/* int v[] = { 8, 5, 3, 2, 1, 1, 0 }; */
    	/* int v[] = { 8, 5, 0, 1, 3, 2, 1 }; */
    	size_t n = sizeof(v) / sizeof(int);
    
    	switch (asc_descending(v, n, sizeof(int), &cmp)) {
    	case ASCENDING:
    		printf("aufsteigend\n");
    		break;
    	case DESCENDING:
    		printf("absteigend\n");
    		break;
    	case UNORDERED:
    		printf("unsortiert\n");
    		break;
    	default:
    		printf("Autsch!\n");
    	}
    
    	return EXIT_SUCCESS;
    }
    

Anmelden zum Antworten