{ Visit: http://g-lts.info/ for more code! }
#include <stdio.h>
#include <string.h> /* Για να χρησιμοποιήσω την συνάρτηση 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! }
Comments