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