smgr

sg_sort.h

May 9th, 2015
264
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.55 KB | None | 0 0
  1. /**
  2. * \file sg_sort.hpp
  3. *
  4. * Generikus rendező algoritmus, ami
  5. * az elemek előfordulási gyakorisága
  6. * szerint rendez egy tömböt.
  7. */
  8.  
  9.  #ifndef SORT_HPP
  10.  #define SORT_HPP
  11.  
  12. /// elemek és darabszámuk tárolása a gyakoriság miatt
  13. template <class T>
  14. struct element {
  15.     T data;         // számolandó elem
  16.     int n;          // számolandó elem darabszáma
  17. };
  18.  
  19.  
  20. /// tömb egyedi elemeinek száma
  21. /// @param  _array      vizsgálandó tömb
  22. /// @param  length      vizsgálandó tömb mérete
  23. /// return              tömb egyedi elemeinek száma
  24. template <class T>
  25. int Unique(const T *_array, int length) {
  26.  
  27.     int db = 0;
  28.     T *tmp = new T[length];
  29.     for (int i = 0; i < length; i++) {
  30.         bool volt = false;
  31.         for (int j = 0; j < length; j++)
  32.         if (_array[i] == tmp[j])
  33.             volt = true;
  34.         if (!volt)   tmp[db++] = _array[i];
  35.     }
  36.     delete[] tmp;
  37.     return db;
  38.  
  39. }
  40.  
  41.  
  42. /// Generikus rendező algoritmus, ami
  43. /// az elemek előfordulási gyakorisága
  44. /// szerint rendez egy tömböt.
  45. /// @param  _array      rendezendő tömb
  46. /// @param  length      rendezendő tömb mérete
  47. /// @param  debug       debug mode on / off
  48. template <class T>
  49. void sg_sort(T *_array, int length, bool debug = false) {
  50.  
  51.     if (debug) {
  52.         // tömb elemeinek vizsgálata
  53.         std::cout << "original array (length=" << length << ")" << std::endl;
  54.         for (int i = 0; i < length; i++) {
  55.             int db = 0;
  56.             for (int j = 0; j < length; j++) {
  57.                 if (_array[i] == _array[j])
  58.                     db++;
  59.             }
  60.             std::cout << " " << _array[i] << " {" << db << "}" << std::endl;
  61.         }
  62.         std::cout << std::endl;
  63.     }
  64.  
  65.  
  66.     // egyedi elemek száma
  67.     int newLength = Unique<int>(_array, length);
  68.     if (debug)  std::cout << "new array (length=" << newLength << ")" << std::endl;
  69.  
  70.     // új tömb az egyedi elemek tárolására
  71.     if (newLength < 0)  throw std::out_of_range("sg_sort()");
  72.     element<T> *result = new element<T>[newLength];
  73.     int m = 0;  // tömb indexelő
  74.  
  75.     for (int i = 0; i < length; i++) {
  76.         // benne van már a listába az akt. elem vagy nem
  77.         bool volt = false;
  78.         for (int j = 0; j < newLength; j++) {
  79.             if (_array[i] == result[j].data) {
  80.                 volt = true;
  81.                 break;
  82.             }
  83.         }
  84.         if (!volt) {
  85.             // még nincs benne a listába az adott elem
  86.             result[m].data = _array[i];
  87.             result[m++].n = 1;
  88.         } else {
  89.             // az adott elem már benne van a listába, növelni kell a számlálóját
  90.             int result_idx = 0;
  91.             for (int j = 0; j < newLength; j++) {
  92.                 // index keresése az adott elemhez
  93.                 if (result[j].data == _array[i]) {
  94.                     result_idx = j;
  95.                     break;
  96.                 }
  97.             }
  98.             (result[result_idx].n)++;   // adott elem számlálójának növelése
  99.         }
  100.     }
  101.  
  102.     if (debug) {
  103.         for (int i = 0; i < newLength; i++) {
  104.             std::cout << " " << result[i].data << " {" << result[i].n << "}" << std::endl;
  105.         }
  106.     }
  107.  
  108.     // eredmény tömb rendezése
  109.     if (debug) { std::cout << std::endl << "sorted array (length=" << newLength << ")" << std::endl; }
  110.     for (int i = 0; i < length - 1; i++) {
  111.         for (int j = 0; j < length - 1; j++) {
  112.             if (result[j].n > result[j + 1].n) {
  113.                 element<T> tmp = result[j];
  114.                 result[j] = result[j + 1];
  115.                 result[j + 1] = tmp;
  116.             }
  117.         }
  118.     }
  119.     if (debug) {
  120.         for (int i = 0; i < newLength; i++) {
  121.             std::cout << " " << result[i].data << " {" << result[i].n << "}" << std::endl;
  122.         }
  123.     }
  124.  
  125.  
  126.     for (int i = 0; i < length;) {          //  _array.length
  127.         for (int j = 0; j < newLength; j++) {   //  result.length
  128.             int count = 0;
  129.             while (count < result[j].n) {       //  result[x].n
  130.                 _array[i++] = result[j].data;
  131.                 count++;
  132.             }
  133.         }
  134.     }
  135.  
  136.     delete[] result;    // temporális tömb törlése <-- BUG BUG BUG
  137. }
  138.  
  139.  
  140.  #endif // SORT_HPP
Advertisement
Add Comment
Please, Sign In to add comment