{ Visit: http://g-lts.info/ for more code! } #include #include /* Για να χρησιμοποιήσω την συνάρτηση memmove() */ #define ARRAY_MAX 6 void rank_sort ( int a[] ); /* Υλοποίηση του αλγορίθμου "ταξινόμηση με κατάταξη" -Rank Sort- . */ void printArray( int a[] ); /* Εμφανίζει τα στοιχεία του πίνακα που δέχεται ως παράμετρο. */ void swap( int *, int * ); /* Εναλλάσσει τις τιμές που δείχνουν οι δείκτες. */ int main (void) { int a[] = { 44, 21, 78, 16, 56, 21 } ; /* 6 θέσεων. */ /* Ταξινομημένα -> 16 21 21 44 56 78 . */ /* Εμφάνιση του αταξινόμητου πίνακα : */ printArray(a); /* Ταξινόμηση με τον αλγόριθμο rank sort : */ rank_sort(a); /* Εμφάνιση του ταξινομημένου πλέον πίνακα : */ printArray(a); return 0; } /* ============================================================================================================== */ /*=============================================================================*/ /* ===============================- RANK SORT -=============================== */ /*=============================================================================*/ void rank_sort ( int a[] ) { int rank[ARRAY_MAX] = {0}; /* Δήλωση του πίνακα RANK που στην κάθε θέση του θα περιέχει την RANK τιμή της αντίστοιχης θέσης του πίνακα a[]. */ int current, key; int j; /* Ο δείκτης που θα εξετάζει κάθε φορά από την αρχή τον πίνακα ( ώστε να βρούμε το rank του current στοιχείου ) */ int rank_value = 0; for ( current = 0; current < ARRAY_MAX; current++ ) { key = a[current]; /* Το στοιχείο της εξεταζόμενης θέσης. */ /* Θα πάρω τον πίνακα από την αρχή.. */ for ( j = 0 , rank_value = 0 ; j < ARRAY_MAX; j++ ) { /* Αν ήμαστε από τα αριστερά ( < ) του τρέχοντος εξεταζόμενου στοιχείου, μετράμε ΚΑΙ τα ίσα ΚΑΙ τα μικρότερα : */ if ( ( j < current ) && ( a[j] <= key ) ) rank_value++; /* Αν ήμαστε από τα δεξιά ( > ) του τρέχοντος εξεταζόμενου στοιχείου, μετράμε τα μικρότερα ΜΟΝΟ. */ if ( ( j > current ) && ( a[j] < key ) ) rank_value++; } rank[ current ] = rank_value; /* Το rank του στοιχείου. */ } /* Ως εδώ, έχουμε τον πίνακα RANK που δείχνει η κάθε θέση του, την τιμή κατάταξης του στοιχείου της αντίστοιχης θέσεις του πίνακα α[] . */ /* Εκτυπώνω την rank τιμή που αντιστοιχεί στις αντίστοιχες θέσεις του πίνακα a[] : */ printArray( rank ); /* Εδώ πλέον δεν χρησιμοποιείται άλλη δομή ( πίνακας ) για την ταξινόμηση του αρχικού πίνακα, αλλά δείτε πως γίνεται επί τόπου : */ for ( j = 0; j < ARRAY_MAX; j++) { int key = rank[j] ; swap( &a[j] , &a[key] ); swap( &rank[j] , &rank[key] ); } } /* ============================================================================================================== */ /* ==================== Υλοποίηση της συνάρτησης που εμφανίζει τον πίνακα. ==================== */ void printArray( int a[] ) { int i = 0 ; for ( i = 0; i < ARRAY_MAX; i++ ) printf( "%d " , a[i] ); printf("\n"); } /* ============================================================================================================== */ /* ==================== Υλοποίηση της συνάρτησης που κάνει την εναλλαγή τιμών. ==================== */ void swap(int * a , int * b) { int temp = *b; *b = *a; *a = temp; } /* ============================================================================================================== */ { Visit: http://g-lts.info/ for more code! }