Tassos

Ταξινόμηση με μέθοδο της κατάταξης ( Rank Sort - In Place ).

Oct 17th, 2015
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.63 KB | None | 0 0
  1. {                                      Visit:    http://g-lts.info/    for more code!                            }
  2.  
  3. #include <stdio.h>
  4. #include <string.h> /* Για να χρησιμοποιήσω την συνάρτηση memmove() */
  5.  
  6. #define ARRAY_MAX 6
  7.  
  8.  
  9. void rank_sort ( int a[] );
  10. /* Υλοποίηση του αλγορίθμου "ταξινόμηση με κατάταξη" -Rank Sort- . */
  11.  
  12.  
  13. void printArray( int a[] );
  14. /* Εμφανίζει τα στοιχεία του πίνακα που δέχεται ως παράμετρο. */
  15.  
  16.  
  17.  
  18. void swap( int *, int * );
  19. /* Εναλλάσσει τις τιμές που δείχνουν οι δείκτες. */
  20.  
  21.  
  22.  
  23. int main (void)
  24. {
  25.     int a[] = { 44,  21,  78,  16,  56,  21 } ; /* 6 θέσεων. */
  26. /* Ταξινομημένα ->  16   21   21   44   56   78  . */
  27.  
  28.  
  29. /* Εμφάνιση του αταξινόμητου πίνακα : */
  30. printArray(a);
  31.  
  32. /* Ταξινόμηση με τον αλγόριθμο rank sort : */
  33. rank_sort(a);
  34.  
  35.  
  36.  
  37. /* Εμφάνιση του ταξινομημένου πλέον πίνακα :  */
  38. printArray(a);
  39.  
  40.  
  41. return 0;
  42. }
  43.  
  44.  
  45.  
  46. /* ============================================================================================================== */
  47.  
  48.  
  49. /*=============================================================================*/
  50. /* ===============================- RANK SORT -=============================== */
  51. /*=============================================================================*/
  52.  
  53. void rank_sort ( int a[] )
  54. {
  55. int rank[ARRAY_MAX] = {0}; /* Δήλωση του πίνακα RANK που στην κάθε θέση του θα περιέχει την RANK τιμή της αντίστοιχης θέσης του πίνακα a[]. */
  56.  
  57. int current, key;
  58. int j; /* Ο δείκτης που θα εξετάζει κάθε φορά από την αρχή τον πίνακα ( ώστε να βρούμε το rank του current στοιχείου )  */
  59. int rank_value = 0;
  60.  
  61.  
  62. for ( current = 0; current < ARRAY_MAX; current++ )
  63.     {
  64.    
  65.     key = a[current]; /* Το στοιχείο της εξεταζόμενης θέσης. */
  66.    
  67.     /* Θα πάρω τον πίνακα από την αρχή.. */
  68.     for ( j = 0 , rank_value = 0 ; j < ARRAY_MAX; j++ )
  69.    
  70.     {
  71.         /* Αν ήμαστε από τα αριστερά ( < ) του τρέχοντος εξεταζόμενου στοιχείου, μετράμε ΚΑΙ τα ίσα ΚΑΙ τα μικρότερα :  */
  72.         if ( ( j < current ) && ( a[j] <= key ) )
  73.             rank_value++;
  74.        
  75.         /* Αν ήμαστε από τα δεξιά ( > ) του τρέχοντος εξεταζόμενου στοιχείου, μετράμε τα μικρότερα ΜΟΝΟ. */
  76.         if ( ( j > current ) && ( a[j] < key ) )
  77.             rank_value++;
  78.     }
  79.    
  80.     rank[ current ] = rank_value; /* Το rank του στοιχείου. */
  81.  
  82.    
  83.     }
  84.  
  85. /* Ως εδώ, έχουμε τον πίνακα RANK που δείχνει η κάθε θέση του, την τιμή κατάταξης του στοιχείου της αντίστοιχης θέσεις του πίνακα α[]  . */
  86.  
  87. /* Εκτυπώνω την rank τιμή που αντιστοιχεί στις αντίστοιχες θέσεις του πίνακα a[] : */
  88. printArray( rank );
  89.  
  90.  
  91. /* Εδώ πλέον δεν χρησιμοποιείται άλλη δομή ( πίνακας ) για την ταξινόμηση του αρχικού πίνακα, αλλά δείτε πως γίνεται επί τόπου : */
  92. for ( j = 0; j < ARRAY_MAX; j++)
  93.     {
  94.    
  95.     int key = rank[j] ;
  96.    
  97.     swap( &a[j] , &a[key] );
  98.    
  99.     swap( &rank[j] , &rank[key] );
  100.        
  101.     }
  102.  
  103.  
  104. }
  105. /* ============================================================================================================== */
  106.  
  107.  
  108.  
  109.  
  110. /* ==================== Υλοποίηση της συνάρτησης που εμφανίζει τον πίνακα. ==================== */
  111. void printArray( int a[] )
  112. {
  113.  
  114.     int i = 0 ;
  115.  
  116.     for ( i = 0; i < ARRAY_MAX; i++ )
  117.         printf( "%d " , a[i] );
  118.    
  119.     printf("\n");
  120.  
  121. }
  122.  
  123. /* ============================================================================================================== */
  124.  
  125.  
  126.  
  127.  
  128. /* ==================== Υλοποίηση της συνάρτησης που κάνει την εναλλαγή τιμών. ==================== */
  129.  
  130. void swap(int * a , int * b)
  131. {
  132.  
  133.     int temp = *b;
  134.     *b = *a;
  135.     *a = temp;
  136.  
  137. }
  138.  
  139. /* ============================================================================================================== */
  140.  
  141.  
  142.  
  143. {                                      Visit:    http://g-lts.info/    for more code!                            }
Advertisement
Add Comment
Please, Sign In to add comment